0

私は2つの辞書を持っています

a = {'I': [1,2], 'II': [1,2], 'III': [1,2]}
b = {'I': [3,4], 'II': [3,4], 'IV': [3,4]}

次の結果が得られるようにそれらをマージするにはどうすればよいですか

c = merge_dicts(a,b)

ここで、c は{'I': [1,2,3,4], 'II': [1,2,3,4], 'III': [1,2], 'IV': [3,4]}

これを行うための良いpythonicの方法はありますか?

私はpythonicのような言葉を使っていますが、私はpythonの初心者です。前もって感謝します。

4

4 に答える 4

5

すべての値が必要な場合:

from itertools import chain
from collections import defaultdict

a = {'I': [1,2], 'II': [1,2], 'IV': [1,2]}
b = {'I': [3,4], 'II': [3,4], 'V': [3,4]}

d = defaultdict(list)
for key, value in chain(a.iteritems(), b.iteritems()):
    d[key].extend(value)
d

出力:

defaultdict(<type 'list'>, {'I': [1, 2, 3, 4], 'II': [1, 2, 3, 4], 'V': [3, 4], 'IV': [1, 2]})
于 2012-09-28T06:15:33.593 に答える
3

それらが同じキーを持っていると確信していますか? あなたがすることができます:

c = dict( (k,a[k]+b[k]) for k in a )

リストを追加すると連結されるため、 which equalsa[k] + b[k]のようなものが得られます。コンストラクターは、ペアになる一連の 2 要素 iterable を取ることができます。[1,2]+[3,4][1,2,3,4]dictkeyvalue

キーを共有しない場合は、sets を使用できます。

aset = set(a)
bset = set(b)
common_keys = aset & bset
a_only_keys = aset - bset
b_only_keys = bset - aset

c = dict( (k,a[k]) for k in a_only_keys )
c.update( (k,b[k]) for k in b_only_keys )
c.update( (k,a[k]+b[k]) for k in common_keys )
于 2012-09-28T06:07:24.500 に答える
2
>>> from collections import Counter
>>> class ListAccumulator(Counter):
...     def __missing__(self, key):
...         return []
... 
>>> a = {'I': [1,2], 'II': [1,2], 'III': [1,2]}
>>> b = {'I': [3,4], 'II': [3,4], 'IV': [3,4]}
>>> 
>>> ListAccumulator(a) + ListAccumulator(b)
Counter({'IV': [3, 4], 'I': [1, 2, 3, 4], 'II': [1, 2, 3, 4], 'III': [1, 2]})
于 2012-09-28T06:33:20.030 に答える
1
>>> a = {'I': [1,2], 'II': [1,2]}
>>> b = {'I': [3,4], 'II': [3,4]}
>>> {key:a[key]+b[key] for key in a}
{'I': [1, 2, 3, 4], 'II': [1, 2, 3, 4]}

これは、キーを正確に共有している場合にのみ機能することに注意してください。

于 2012-09-28T06:08:10.060 に答える