[英]Python - Sum by Unique Attributes in a List of Attributes
如果我有一个对象列表listOfObj
,并且每个对象至少具有2个属性,则obj.value
是一个浮点数,而obj.name
是一个字符串,获取所有obj.value
的和的最佳方法是什么列表中每个唯一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]])
显然,这不是执行此操作的最佳方法。 解决此问题的最佳方法是什么? 谢谢。
作为Mattia Procopio答案的替代方法,您可以使用defaultdict创建一个以整数作为默认值的字典,然后遍历对象以根据object.name求和:
from collections import defaultdict
sums = defaultdict(int)
for o in objectlist :
sums[o.name] += o.value
尝试使用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)}
我会说:
sum = {}
for obj in listofObj:
if obj.name in sum:
sum[obj.name] += obj.value
else:
sum[obj.name] = obj.value
如果键存在,它将添加实际值,如果不存在,则使用新名称将其求和指令设置为初始值并设置初始值
以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'))})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.