簡體   English   中英

在鍵匹配的地方添加字典值

[英]Add dictionary values where keys match

我有類似以下的詞典列表:

a=[{'a':1},{'b':2},{'c':3},{'a':-2},{'b':4}]

我需要遍歷列表並在鍵匹配的地方添加值。 結果應如下所示:

a=[{'a':-1},{'b':6},{'c':3}]

感謝您提供幫助。

您可以使用collections.Counter

from collections import Counter
a=[{'a':1},{'b':2},{'c':3},{'a': 4},{'b':4}]
result = sum((Counter(x) for x in a),Counter())

結果是:

Counter({'b': 6, 'a': 5, 'c': 3})

但是,要使用負數,您必須使用循環:

c = Counter()
a=[{'a':1},{'b':2},{'c':3},{'a':-2},{'b':4}]
for x in a:
    c.update(x)

導致:

Counter({'b': 6, 'c': 3, 'a': -1})

這些方法使用一個Counter (類似於multiset / bag),我認為它是比一元dict列表更有用的數據結構,但是如果您確實想要的話,應該足夠容易地轉換為您的數據結構。 ..

[{k:v} for k,v in result.items()]

如果訂單很重要,則可能對result.items()排序...

我能夠用類似的東西來實現它

a = [{'a':1},{'b':2},{'c':3},{'a':-2},{'b':4}]
b = {}

for x in a:
    k,v = x.popitem()

    # Check if the key is already in our output dict
    if k in b.keys():
        b[k] += v

    # If not, create it
    else:
        b[k] = v

哪個輸出

b = {'a': -1, 'b': 6, 'c': 3}

IIUC:

from collections import defaultdict

def dicts_combine(dcts):

    cd = defaultdict(int)
    for subdict in dcts:
        for k,v in subdict.items():
            cd[k] += v

    dsplit = [{k: v} for k,v in sorted(cd.items())]

    return dsplit

應該給出您想要的輸出:

>>> a = [{'a':1},{'b':2},{'c':3},{'a':-2},{'b':4}]
>>> dicts_combine(a)
[{'a': -1}, {'b': 6}, {'c': 3}]

您可以根據需要刪除sorted

暫無
暫無

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

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