17

次の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でこれを達成できますか?

4

5 に答える 5

9

これらの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'} ]
于 2012-09-20T11:48:17.640 に答える
5

あなたは試してみたいかもしれません:

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}は有効な辞書ではありません。

于 2012-09-20T11:40:56.667 に答える
3

定義上、辞書は重複するキーを持つことができないため、辞書を「マージ」すると、実際には次の結果が得られます (順序は任意であることに注意してください)。

{'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])))
于 2012-09-20T11:42:37.757 に答える
2
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}
于 2012-09-20T11:42:52.763 に答える
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 }

于 2012-09-20T11:41:05.940 に答える