如果我有一个对象列表listOfObj
,并且每个对象至少具有2个属性,则obj.value
是浮点数,而obj.name
是字符串,通过列表中的每个唯一obj.value
获取所有obj.name
的总和的最佳方法是什么?
groupby
和sum
在pandas
中几乎是什么。
我可以想到一种简单的方法,但是我想知道(而且我很确定有)是否有一种更优雅的方法。
这是我目前拥有的解决方案。首先,在name
中获得所有唯一的listOfObj
:
unique_atts = {obj.name for obj in listofObj}
然后,对每个属性执行单独的sum
操作,例如
sum_n = sum([obj.value for obj in listOfObj if obj.name == unique_atts[n]])
很显然,这不是最好的方法。解决此问题的最佳方法是什么?谢谢。
答案 0 :(得分:2)
作为Mattia Procopio答案的替代方法,您可以使用defaultdict创建一个以整数作为默认值的字典,然后遍历对象以根据object.name求和:
from collections import defaultdict
sums = defaultdict(int)
for o in objectlist :
sums[o.name] += o.value
答案 1 :(得分:1)
尝试使用itertools.groupby
按名称对对象进行分组,然后获取分组对象的总和
from itertools import groupby
f = lambda x: x.name
d = {name:sum(obj.value for obj in grouped_objs) for name,grouped_objs in groupby(sorted(listOfObj, key=f), f)}
答案 2 :(得分:1)
我会说:
sum = {}
for obj in listofObj:
if obj.name in sum:
sum[obj.name] += obj.value
else:
sum[obj.name] = obj.value
如果键存在,它将添加实际值,如果不存在,它将使用新名称来调用求和字典并设置起始值
答案 3 :(得分:1)
将itertools.groupby
作为关键字对operator.attrgetter('name')
进行排序后。
from itertools import groupby
from operator import attrgetter
print({k: sum(o.value for o in g) for k, g in groupby(sorted(listOfObj, key=attrgetter('name')), attrgetter('name'))})