我有一个 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)]
现在我想对 Elements 类的所有 value 成员求和,如果它们的 id 等于获得此列表:
l = [Element(1, 300), Element(2, 1), Element(3, 8)]
执行此操作最符合 Python 风格的方法是什么?
请您参考如下方法:
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)]
