我有一个Python列表l
,其中包含类Element
的实例:
class Element:
def __init__(self, id, value):
self.id = id
self.value = value
l = [Element(1, 100), Element(1, 200), Element(2, 1), Element(3, 4), Element(3, 4)]
现在,如果类别value
的所有Elements
的成员id
相等,我想对它们进行汇总:
l = [Element(1, 300), Element(2, 1), Element(3, 8)]
最蟒蛇的方式是什么?
答案 0 :(得分:6)
itertools
无法做的(几乎是什么)。看看groupby
:
from itertools import groupby
from operator import attrgetter
class Element:
def __init__(self, id, value):
self.id = id
self.value = value
def __repr__(self): # kudos @mesejo
return "Element({}, {})".format(self.id, self.value)
l = [Element(1, 100), Element(1, 200), Element(2, 1), Element(3, 4), Element(3, 4)]
l.sort(key=attrgetter('id')) # if it is already sorted by 'id', comment-out
res = [Element(g, sum(sub.value for sub in k)) for g, k in groupby(l, key=attrgetter('id'))]
结果为:
print(res) # [Element(1, 300), Element(2, 1), Element(3, 8)]
答案 1 :(得分:2)
一种方法是创建一个defaultdict
来将id映射到值的总和。然后,我们可以获取这些结果并将其用于构建Elements
的新列表。一种方法是使用starmap
将该字典的项目映射到Element
from collections import defaultdict
from itertools import starmap
class Element:
def __init__(self, id, value):
self.id = id
self.value = value
def __repr__(self):
return "Element({}, {})".format(self.id, self.value)
l = [Element(1, 100), Element(1, 200), Element(2, 1), Element(3, 4), Element(3, 4)]
d = defaultdict(int)
for e in l:
d[e.id] += e.value
print(list(starmap(Element, d.items())))
# [Element(1, 300), Element(2, 1), Element(3, 8)]
答案 2 :(得分:1)
您还可以使用output_file
获得唯一的ID,并使用-resume
获得总计的期望结果。例如:
set