7

次のように、一致するキーのセットを持つ任意の数の等しい長さの python 辞書があります。

{'a':1, 'b':4, 'c':8, 'd':9}

{'a':2, 'b':3, 'c':2, 'd':7}

{'a':0, 'b':1, 'c':3, 'd':4}
...

同じキーのセットを持つが、辞書セット内の対応する要素の合計としての値を持つ単一の辞書を取得するにはどうすればよいですか? 言い換えれば、私は欲しい:

{'a':3, 'b':8, 'c':13, 'd':20}

醜い複雑なループ構造があるかもしれませんが、ある種のリスト/辞書理解の巧妙さでこれを行うより良い方法はありますか? 考えてみれば、とにかく醜いループバージョンを作る方法が本当にわからない..

4

4 に答える 4

24

collections.Counter()救助へ ;-)

from collections import Counter
dicts = [{'a':1, 'b':4, 'c':8, 'd':9},
         {'a':2, 'b':3, 'c':2, 'd':7},
         {'a':0, 'b':1, 'c':3, 'd':4}]
c = Counter()
for d in dicts:
    c.update(d)

それで:

>>> print c
Counter({'d': 20, 'c': 13, 'b': 8, 'a': 3})

または、辞書に戻すこともできます:

>>> print dict(c)
{'a': 3, 'c': 13, 'b': 8, 'd': 20}

Counter()すべての入力辞書が同じキーを持っているかどうかは問題ではありません。彼らがそうすることが確実にわかっている場合は、ばかげたものを試すことができます;-)次のようなワンライナー:

d = {k: v for k in dicts[0] for v in [sum(d[k] for d in dicts)]}

Counter()より明確に、より速く、より柔軟に。ただし、公平を期すために、このややばかげていないワンライナーはそれほどばかげていません。

d = {k: sum(d[k] for d in dicts) for k in dicts[0]}
于 2013-10-19T02:48:13.883 に答える
6

単に使用したい場合はdict、これを使用できます

dicts = [{'a':0, 'b':4, 'c':8, 'd':9},
         {'a':0, 'b':3, 'c':2, 'd':7},
         {'a':0, 'b':1, 'c':3, 'd':4}]

result = {}
for myDict in dicts:
    for key, value in myDict.items():
        result.setdefault(key, 0)
        result[key] += value
print result

出力:

{'a': 0, 'c': 13, 'b': 8, 'd': 20}
于 2013-10-19T06:36:13.010 に答える