Python对象列表中的求和属性

2024-04-26 00:20:20 发布

您现在位置:Python中文网/ 问答频道 /正文

"What's the most concise way in Python to group and sum a list of objects by the same property"类似,我有一个脚本,需要在其中对对象列表的属性求和。不过,我的问题略有不同。在

我有一类具有属性V、W、X、Y和Z的对象。我需要遍历属性W、X和Y,并将其与所有其他相同的W、X和Y属性进行匹配来求和属性Z。生成一个由W、X和Y索引的新的和值

以下是对象的类:

class xb(object):
    def __init__(self, V, W, X, Y, Z):
       self.V = V
       self.W = W
       self.X = X
       self.Y = Y
       self.Z = Z

xbs = [xb()]

我最初的想法是通过一系列嵌套的if语句来实现这一点,但这大大降低了处理速度,我确信我的逻辑完全不正常。在

^{pr2}$

如有任何建议,将不胜感激!在


Tags: andtheto对象inselfmost属性
2条回答

这里有一个非常肮脏的一行代码:

{key:sum(g.Z for g in group)
    for key, group in 
    itertools.groupby(
        sorted(L, key=lambda p:tuple((operator.attrgetter(a)(p) for a in 'VWXYZ'))),
        key=lambda p:tuple(
                      (operator.attrgetter(a)(p) for a in 'VWXYZ')
                     )
    )
}

我根本不建议这样做(调试很麻烦),但我认为这是一个有趣的解决方案

可以使用defaultdict执行此操作:

from collections import defaultdict
indexed_sums = defaultdict(int)
for o in xbs:
    indexed_sums[(o.W, o.X, o.Y)] += o.Z

例如,如果从(使用xb的类定义)开始:

^{pr2}$

你最终会得到:

print dict(indexed_sums)
# {(4, 3, 4): 8, (2, 3, 4): 15, (2, 3, 9): 3}

因此,可以得到W,X,Y的和为2,3,4:

indexed_sums[(2, 3, 4)]
# 15

注意,defaultdict在这里做的工作非常少(它只是一个默认从0开始的计数字典):主要的事情是您正在为字典中的(o.W, o.X, o.Y)元组建立索引。如果没有defaultdict,您可以做同样的事情:

indexed_sums = {}
for o in xbs:
    if (o.W, o.X, o.Y) not in indexed_sums:
        indexed_sums[(o.W, o.X, o.Y)] = 0
    indexed_sums[(o.W, o.X, o.Y)] += o.Z

defaultdict只为您节省了两行代码。在

相关问题 更多 >