繁体   English   中英

Python-属性列表中按唯一属性求和

[英]Python - Sum by Unique Attributes in a List of Attributes

如果我有一个对象列表listOfObj ,并且每个对象至少具有2个属性,则obj.value是一个浮点数,而obj.name是一个字符串,获取所有obj.value的和的最佳方法是什么列表中每个唯一obj.name obj.value

这几乎是groupbysumpandas所做的。

我可以想到一种简单的方法,但是我想知道(而且我很确定有)是否有一种更优雅的方法来做到这一点。

这是我目前拥有的解决方案。 首先,在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM