次の2つの辞書があります。
D1={'a':1,'b':2,'c':3}
と
D2={'b':2,'c':3,'d':1}
これら 2 つの辞書をマージしたいのですが、結果は次のようになります。
D3={'a':1,'b':2,'c':3,'b':2,'c':3,'d':1}
どうすればPythonでこれを達成できますか?
次の2つの辞書があります。
D1={'a':1,'b':2,'c':3}
と
D2={'b':2,'c':3,'d':1}
これら 2 つの辞書をマージしたいのですが、結果は次のようになります。
D3={'a':1,'b':2,'c':3,'b':2,'c':3,'d':1}
どうすればPythonでこれを達成できますか?
これらの2つの辞書をマージしたいのですが、結果は次のようになります。
D3 = {'a':1、'b':2、'c':3、'b':2、'c':3、'd':1}
Pythonでこれをどのように達成できますか?
できません。Pythondictではキーごとに1つの値しか持つことができません。あなたができることは、値としてリストまたはセットを持つことです。
セットの例を次に示します。
d1 = { 'a': 1, 'b': 2, 'c': 3 }
d2 = { 'a': 1, 'b': 5, 'd': 4 }
d3 = {}
def add_dict(target, d):
for key in d:
target.setdefault(key, set([])).add(d[key])
add_dict(d3, d1)
add_dict(d3, d2)
これはあなたに与えるでしょうd3
:
{'a': set([1]), 'c': set([3]), 'b': set([2, 5]), 'd': set([4])}
リストを使用してこれを行うこともできます(おそらくあなたの例に近い):
d1 = { 'a':1, 'b':2, 'c': 3}
d2 = { 'b':2 ,'c':3, 'd': 1}
d3 = {}
def add_dict(target, d):
for key in d:
target.setdefault(key, []).append(d[key])
add_dict(d3, d1)
add_dict(d3, d2)
あなたはこれを得るでしょう:
{'a': [1], 'c': [3, 3], 'b': [2, 2], 'd': [1]}
ただし、{'a':1,'b':2,'c':3,'b':2,'c':3,'d':1}
(これは口述にはなり得ません)を見ると、まったく別のデータ構造を求めているようです。おそらくこのようなもの:
d1 = { 'a':1, 'b':2, 'c': 3}
d2 = { 'b':2 ,'c':3, 'd': 1}
result = []
result += [ { 'key': key, 'value': d1[key] } for key in d1 ]
result += [ { 'key': key, 'value': d2[key] } for key in d2 ]
これにより、これが生成されます。これは、最初に念頭に置いていたデータ構造に近くなります。
[ {'value': 1, 'key': 'a'},
{'value': 3, 'key': 'c'},
{'value': 2, 'key': 'b'},
{'value': 3, 'key': 'c'},
{'value': 2, 'key': 'b'},
{'value': 1, 'key': 'd'} ]
あなたは試してみたいかもしれません:
D3 = {}
D3.update(D1)
D3.update(D2)
ここでは、D3
最初に空の辞書を作成してから、他の 2 つの辞書から更新します。
更新の順序に注意する必要があることに注意してください。D2
いくつかのキーを と共有している場合D1
、上記のコードは の対応するエントリを のエントリで上書きしD1
ますD2
。
キーが繰り返されないことにも注意してください。あなたが与える例D3={a:1,b:2,c:3,b:2,c:3,d:1}
は有効な辞書ではありません。
定義上、辞書は重複するキーを持つことができないため、辞書を「マージ」すると、実際には次の結果が得られます (順序は任意であることに注意してください)。
{'a': 1, 'b': 2, 'c': 3, 'd': 1}
辞書の 1 つのクローンを作成し、他の辞書のエントリをそれにマージできます。
D3 = dict(D1)
D3.update(D2)
または、各入力辞書の (キー、値) タプルの連結から新しい辞書を作成できます。
D3 = dict(D1.items() + D2.items())
重複キーに複数の値が本当に必要な場合は、各キーの値のリストのようなものが必要です。
from itertools import groupby
dict(( (key, [v for k, v in group]) for key, group in groupby(sorted(D1.items() + D2.items()), lambda x: x[0])))
In [3]: D1={'a':1,'b':2,'c':3}
In [4]: D2={'b':2,'c':3,'d':1}
In [5]: D1.update(D2)
In [6]: D1
Out[6]: {'a': 1, 'b': 2, 'c': 3, 'd': 1}
アップデート
代替ソリューション
In [9]: D3=D1.copy()
In [10]: D3.update(D2)
In [11]: D3
Out[11]: {'a': 1, 'b': 2, 'c': 3, 'd': 1}
In [12]: D4=dict(D1, **D2)
また
In [13]: D4
Out[13]: {'a': 1, 'b': 2, 'c': 3, 'd': 1}
また
In [16]: D5 = dict(D1.items() + D2.items())
In [17]: D5
Out[17]: {'a': 1, 'b': 2, 'c': 3, 'd': 1}
Python ディクショナリで同じ値を持つ 2 つの異なるキーを持つことはできないため、あなたが求めていることは不可能です。
あなたの質問に対する最も近い答えは次のとおりです。
D3 = dict( D1.items() + D2.items() )
注: 同じキーに異なる値がある場合、D2 の値が D3 の値になります。
例:
D1 = { 'a':1, 'b'=2 }
D2 = { 'c':3, 'b':3}
次に、D3 は次のようになります。
D3= { 'a':1, 'b':3, 'c':3 }