辞書のリストを単一の辞書にマージするにはどうすればよいですか?


124

このようにディクテーションのリストをどのように変えることができますか

[{'a':1}, {'b':2}, {'c':1}, {'d':2}]

このような単一の辞書に

{'a':1, 'b':2, 'c':1, 'd':2}


確かに、それはリストの口述に統合されます。
Katriel

1
これはリストであり、dictではありません:>>> type([{'a':1}、{'b':2}])<type 'list'>
killown

それがどれほど頻繁に登場するかを考えると、これには本当に1つのライナーがあるはずです。{** d for d in d_list}がサポートされていない理由はありますか?
マルケムス

回答:


163

これは、任意の長さの辞書で機能します。

>>> result = {}
>>> for d in L:
...    result.update(d)
... 
>>> result
{'a':1,'c':1,'b':2,'d':2}

理解として:

# Python >= 2.7
{k: v for d in L for k, v in d.items()}

# Python < 2.7
dict(pair for d in L for pair in d.items())


6
>>> L=[{'a': 1}, {'b': 2}, {'c': 1}, {'d': 2}]    
>>> dict(i.items()[0] for i in L)
{'a': 1, 'c': 1, 'b': 2, 'd': 2}

注:辞書が順序付けられていないため、「b」と「c」の順序は出力と一致しません

辞書が複数のキー/値を持つことができる場合

>>> dict(j for i in L for j in i.items())

リスト内のいずれかの辞書に複数のアイテムがある場合は失敗します。
PaulMcG 2010

2
cough *(各辞書にキーと値のペアが1つだけ含まれていると仮定)* cough
Katriel

ああ、まあ最初に一般的なディクテーションで機能するメソッドを投稿しましたが、OPはそれを必要としないようでした
John La Rooy

5

フラット辞書の場合、これを行うことができます:

from functools import reduce
reduce(lambda a, b: dict(a, **b), list_of_dicts)

4

これは@delnanに似ていますが、k / v(キー/値)アイテムを変更するオプションがあり、読みやすくなっています。

new_dict = {k:v for list_item in list_of_dicts for (k,v) in list_item.items()}

たとえば、次のようにk / v要素を置き換えます。

new_dict = {str(k).replace(" ","_"):v for list_item in list_of_dicts for (k,v) in list_item.items()}

リストからdictオブジェクトを引き出した後、辞書.items()ジェネレータからk、vタプルを解凍します


2
dict1.update( dict2 )

重複したキーをどうするかを選択する必要があるため、これは非対称です。この場合、dict2上書きされますdict1。逆に交換してください。

編集:ああ、申し訳ありませんが、それはわかりませんでした。

これを単一の式で行うことができます。

>>> from itertools import chain
>>> dict( chain( *map( dict.items, theDicts ) ) )
{'a': 1, 'c': 1, 'b': 2, 'd': 2}

この最後のクレジットはありません。

ただし、単純なforループでこれを行うには、よりPythonic(明示的>暗黙的、フラット>入れ子)のほうが多いかもしれません。YMMV。


1
dictではなくそのリスト:>>> type([{'a':1}、{'b':2}])<type 'list'>
killown



0
>>> dictlist = [{'a':1},{'b':2},{'c':1},{'d':2, 'e':3}]
>>> dict(kv for d in dictlist for kv in d.iteritems())
{'a': 1, 'c': 1, 'b': 2, 'e': 3, 'd': 2}
>>>

注複数のエントリで機能することを示すために、最後の辞書に2つ目のキーと値のペアを追加しました。また、リストの後半にある辞書のキーは、以前の辞書の同じキーを上書きします。


-1

dic1 = {'Maria':12、 'Paco':22、 'Jose':23} dic2 = {'Patricia':25、 'Marcos':22 'Tomas':36}

dic2 = dict(dic1.items()+ dic2.items())

これが結果になります:

dic2 {'Jose':23、 'Marcos':22、 'Patricia':25、 'Tomas':36、 'Paco':22、 'Maria':12}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.