簡體   English   中英

匯總Python對象列表中的屬性

[英]Summing Attribute in a list of Python Objects

類似於“ Python中用同一屬性對對象列表進行分組和匯總的最簡潔方法是什么” ,我有一個腳本,需要在其中添加對象列表的屬性。 但是,我的問題略有不同。

我有一類具有屬性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語句來執行此操作,但是這會大大減慢處理速度,而且我確信我的邏輯是不明智的。

for xb in xbs:
    if xb.W == xb.W:
          if xb.X == xb.X:
              if xb.Y == xb.Y:
                  sum(xb.Z)

任何建議對此將不勝感激!

您可以使用defaultdict執行此操作:

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

例如,如果您開始使用(使用xb的類定義):

xbs = [xb(1, 2, 3, 4, 5),
       xb(1, 2, 3, 4, 5),
       xb(1, 2, 3, 4, 5),
       xb(1, 4, 3, 4, 5),
       xb(1, 4, 3, 4, 3),
       xb(1, 2, 3, 9, 3)]

您最終得到:

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的計數字典):主要是要在字典中索引(oW, oX, oY)元組。 如果沒有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只為您節省了兩行。

這是一個單線的非常骯臟的技巧:

{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')
                     )
    )
}

我完全不建議這樣做(調試起來很痛苦),但是我仍然認為這是一個有趣的解決方案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM