如何通过前两个值 group/aggregate/reduce python list/tuple 的第三个值(不使用 for 循环)?
How to group/aggregate/reduce third values of a python list/tuple by the first two values (without using for loops)?
按以下方式 group/aggregate/reduce python 元组的最佳方法是什么(不使用嵌套 for 循环)。
例如,给定以下元组:
entry1 = ('name1', 'surname1', 'product1')
entry2 = ('name1', 'surname1', 'product2')
entry3 = ('name1', 'surname1', 'product3')
entry4 = ('name2', 'surname2', 'product1')
entry5 = ('name2', 'surname2', 'product2')
entry6 = ('name2', 'surname2', 'product3')
如何实现函数func
:
func(entry1, entry2, entry3, entry4, entry5, entry6)
return 数据格式类似于:
(('name1', 'surname1', ('product1', 'product2', 'product3')),
('name2', 'surname2', ('product1', 'product2', 'product3')))
备注:
- 结果的顺序并不重要。
- 结果可以是列表或元组
- 强制产品唯一性很好,但不是必需的。即
('name1', 'surname1', ('product1', 'product1', 'product2', 'product3'))
这样的结果是可以的。
您可以先使用 collections.defaultdict
进行分组,然后再转换为列表或元组:
from collections import defaultdict
def func(*args):
d = defaultdict(list)
for entry in args:
d[entry[0], entry[1]].append(entry[2])
return tuple((k[0], k[1], tuple(v)) for k, v in d.items())
测试:
entry1 = ('name1', 'surname1', 'product1')
entry2 = ('name1', 'surname1', 'product2')
entry3 = ('name1', 'surname1', 'product3')
entry4 = ('name2', 'surname2', 'product1')
entry5 = ('name2', 'surname2', 'product2')
entry6 = ('name2', 'surname2', 'product3')
print(func(entry1, entry2, entry3, entry4, entry5, entry6))
结果:
(('name1', 'surname1', ('product1', 'product2', 'product3')),
('name2', 'surname2', ('product1', 'product2', 'product3')))
按以下方式 group/aggregate/reduce python 元组的最佳方法是什么(不使用嵌套 for 循环)。
例如,给定以下元组:
entry1 = ('name1', 'surname1', 'product1')
entry2 = ('name1', 'surname1', 'product2')
entry3 = ('name1', 'surname1', 'product3')
entry4 = ('name2', 'surname2', 'product1')
entry5 = ('name2', 'surname2', 'product2')
entry6 = ('name2', 'surname2', 'product3')
如何实现函数func
:
func(entry1, entry2, entry3, entry4, entry5, entry6)
return 数据格式类似于:
(('name1', 'surname1', ('product1', 'product2', 'product3')),
('name2', 'surname2', ('product1', 'product2', 'product3')))
备注:
- 结果的顺序并不重要。
- 结果可以是列表或元组
- 强制产品唯一性很好,但不是必需的。即
('name1', 'surname1', ('product1', 'product1', 'product2', 'product3'))
这样的结果是可以的。
您可以先使用 collections.defaultdict
进行分组,然后再转换为列表或元组:
from collections import defaultdict
def func(*args):
d = defaultdict(list)
for entry in args:
d[entry[0], entry[1]].append(entry[2])
return tuple((k[0], k[1], tuple(v)) for k, v in d.items())
测试:
entry1 = ('name1', 'surname1', 'product1')
entry2 = ('name1', 'surname1', 'product2')
entry3 = ('name1', 'surname1', 'product3')
entry4 = ('name2', 'surname2', 'product1')
entry5 = ('name2', 'surname2', 'product2')
entry6 = ('name2', 'surname2', 'product3')
print(func(entry1, entry2, entry3, entry4, entry5, entry6))
结果:
(('name1', 'surname1', ('product1', 'product2', 'product3')),
('name2', 'surname2', ('product1', 'product2', 'product3')))