如何通过前两个值 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')))

备注:

您可以先使用 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')))