7

結果に次のものが含まれるように、2 つの辞書 A と B をマージしたいと考えています。

  • キーが A に固有である A からのすべてのペア
  • キーが B に固有である B からのすべてのペア
  • A と B の両方に同じキーが存在する f(valueA, valueB)

例えば:

def f(x, y):
    return x * y

A = {1:1, 2:3}
B = {7:3, 2:2}

C = merge(A, B)

出力:

{1:1, 7:3, 2:6}

これを行うには、ワンライナーが必要なようです。

4

8 に答える 8

10

これを実現するには、ディクショナリ ビューを使用します。dict.viewkeys()結果はセットのように機能し、交差と対称差を実行できます。

def merge(A, B, f):
    # Start with symmetric difference; keys either in A or B, but not both
    merged = {k: A.get(k, B.get(k)) for k in A.viewkeys() ^ B.viewkeys()}
    # Update with `f()` applied to the intersection
    merged.update({k: f(A[k], B[k]) for k in A.viewkeys() & B.viewkeys()})
    return merged

Python 3 では、.viewkeys()メソッドの名前が に変更され.keys()、古い.keys()機能 (Python 2 ではリストを返す) が置き換えられました。

上記のmerge()方法は、任意の任意の に対して機能する一般的なソリューションf()です。

デモ:

>>> def f(x, y):
...     return x * y
... 
>>> A = {1:1, 2:3}
>>> B = {7:3, 2:2}
>>> merge(A, B, f)
{1: 1, 2: 6, 7: 3}
>>> merge(A, B, lambda a, b: '{} merged with {}'.format(a, b))
{1: 1, 2: '3 merged with 2', 7: 3}
于 2013-05-15T09:08:00.683 に答える
1

これを盗む ( A.get(k, B.get(k))@MartijnPieters からのスニペット

>>> def f(x, y):
        return x * y

>>> A = {1:1, 2:3}
>>> B = {7:3, 2:2}
>>> {k: f(A[k], B[k]) if k in A and k in B else A.get(k, B.get(k))
     for k in A.viewkeys() | B.viewkeys()}
{1: 1, 2: 6, 7: 3}
于 2013-05-15T09:18:15.387 に答える
0
>>> def f(x,y):
...     return x*y
... 
>>> dict([(k,v) for k,v in A.items()] + [ (k,v) if k not in A else (k,f(A[k],B[k])) for k,v in B.items()])
{1: 1, 2: 6, 7: 3}
于 2013-05-15T09:13:27.457 に答える
0
from itertools import chain

intersection = set(A.keys()).intersection(B.keys())
C = dict(chain(A.items(), B.items(), ((k, f(A[k], B[k])) for k in intersection)))

技術的にはワンライナーにすることができます。Py2 と Py3 の両方で動作します。Py3 だけに関心がある場合は、「交差」行を次のように書き換えることができます。

intersection = A.keys() & B.keys()

(Py2 のみの場合は、A.viewkeys() & B.viewkeys()代わりに使用してください。)

于 2013-05-15T09:25:13.337 に答える
-1
def merge_dict(dict1,dict2):
    dict1={1:'red'}
    dict2={2:'black',3:'yellow'}
    dict1.update(dict2)
    print 'dict3 =',dict1

merge_dict(dict1,dict2)

出力:

dict3 = {1: 'red', 2: 'black', 3: 'yellow'}
于 2014-10-31T02:23:18.407 に答える