如果我有一个对象列表 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'))})
