簡體   English   中英

如何通過使用公共密鑰對值進行求和,從一系列dicts創建單個Python dict?

[英]How to create single Python dict from a list of dicts by summing values with common keys?

我有一個詞典列表,例如:

dictList = [
    {'a':3, 'b':9, 'c':4},
    {'a':9, 'b':24, 'c':99},
    {'a':10, 'b':23, 'c':88}
]

所有詞典都具有相同的鍵,例如abc 我希望創建一個具有相同鍵的單個字典,其中值是原始列表中所有字典中具有相同鍵的值的總和。

所以對於上面的例子,輸出應該是:

{'a':22, 'b':56, 'c':191}

這樣做最有效的方法是什么? 我目前有:

result = {}
for myDict in dictList:
    for k in myDict:
        result[k] = result.setdefault(k, 0) + myDict[k]

如果所有的詞都有所有鍵,你可以這樣做:

>>> dict((key, sum(d[key] for d in dictList)) for key in dictList[0])
{'a': 22, 'b': 56, 'c': 191}

[編輯]如果速度是一個重要的優先事項,你也可以用以下代碼減少~20%(雖然以一些可讀性為代價):

import operator, itertools
dict((key, sum(itertools.imap(operator.itemgetter(key), dictList))) 
      for key in dictList[0])

速度取決於字典的大小。 我得到了原始3項列表的以下時間,以及各種不同的大小(通過將原始列表多出10,100或1000等創建):

List Size   Original      dict+generator       imap+itemgetter
      3      0.054          0.090                0.097
     30      0.473          0.255                0.236
    300      4.668          1.884                1.529
   3000     46.668         17.975               14.499

(10,000次運行的所有時間)

所以它只有3個稍慢,但對於較大的列表來說要慢兩到三倍。

試試這個。

from collections import defaultdict
result = defaultdict(int)
for myDict in dictList:
    for k in myDict:
        result[k] += myDict[k]

我不確定它與速度明智的其他答案有什么關系,但總有

from collections import Counter
result = sum(map(Counter,dictList),Counter())

Counterdict的子類,它可以在大多數地方用來代替dict 如有必要,您可以將其轉換回dict

result = dict(result)

暫無
暫無

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

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