如果我有一个对象列表 listOfObj
,并且每个对象至少有 2 个属性,一个 obj.value
,它是一个 float ,和 obj.name
,这是一个字符串,通过列表中每个唯一的 obj.name
获取所有 obj.value
的总和的最佳方法是什么?
groupby
和 sum
在 pandas
中的作用非常相似。
我可以想到一种粗略的方法来做到这一点,但我想知道(而且我很确定有)是否有更优雅的方法来做到这一点。
这是我目前的解决方案。首先,获取 listOfObj
中所有唯一的 name
:
unique_atts = {obj.name for obj in listofObj}
然后,对每个属性执行单独的sum
操作,例如
sum_n = sum([obj.value for obj in listOfObj if obj.name == unique_atts[n]])
显然,这不是最好的方法。解决这个问题的最佳方法是什么?谢谢。
最佳答案
在以 operator.attrgetter('name')
为键排序后使用 itertools.groupby
。
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'))})
关于Python - 按属性列表中的唯一属性求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51512474/