[英]How to group/aggregate/reduce third values of a python list/tuple by the first two values (without using for loops)?
What is the best way to group/aggregate/reduce python tuples in the following manner (without using nested for loops). 以以下方式(不使用嵌套的for循环)对python元组进行分组/聚合/减少的最佳方法是什么?
For example, given the following tuples: 例如,给定以下元组:
entry1 = ('name1', 'surname1', 'product1')
entry2 = ('name1', 'surname1', 'product2')
entry3 = ('name1', 'surname1', 'product3')
entry4 = ('name2', 'surname2', 'product1')
entry5 = ('name2', 'surname2', 'product2')
entry6 = ('name2', 'surname2', 'product3')
How can the function func
: 函数func
如何:
func(entry1, entry2, entry3, entry4, entry5, entry6)
return the data in a similar format to: 以类似的格式返回数据:
(('name1', 'surname1', ('product1', 'product2', 'product3')),
('name2', 'surname2', ('product1', 'product2', 'product3')))
Notes: 笔记:
('name1', 'surname1', ('product1', 'product1', 'product2', 'product3'))
are fine. 那是很好的结果,例如('name1', 'surname1', ('product1', 'product1', 'product2', 'product3'))
。 You can use collections.defaultdict
to group first and later convert to a list or tuple: 您可以使用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())
Test: 测试:
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))
Result: 结果:
(('name1', 'surname1', ('product1', 'product2', 'product3')),
('name2', 'surname2', ('product1', 'product2', 'product3')))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.