满足条件时列表中的值总和

时间:2018-12-19 14:11:48

标签: python list

我有一个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)]

最蟒蛇的方式是什么?

3 个答案:

答案 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