12

これを達成するための良いワンライナー(これを関数に入れる以外)は何ですか:

# like dict1.update(dict2) but does not add any keys from dict2
# that are not already in dict1
for k in dict1:
    if k in dict2:
        dict1[k]=dict2[k]

これはうまくいくと思いますが、「保護された」関数を使用しています:

[dict1.__setitem__(k, dict2[k]) for k in dict1 if k in dict2]
4

2 に答える 2

22
dict1.update((k, dict2[k]) for k in set(dict2).intersection(dict1))

Python 2.6以下でこれを行う方法です(これ以降のバージョンでこれを行う方法については、詳細を参照してください)。

別のマッピングの隣に、2つのディクショナリの設定された共通部分に基づいて生成するタプルdict.update()の反復可能を取得することもできます(したがって、それらが共通に持つすべてのキー)。(key, value)

デモ:

>>> dict1 = {'foo':'bar', 'ham': 'eggs'}
>>> dict2 = {'ham': 'spam', 'bar': 'baz'}
>>> dict1.update((k, dict2[k]) for k in set(dict2).intersection(dict1))
>>> dict1
{'foo': 'bar', 'ham': 'spam'}

Python 2.7では、新しいDictビューを使用して、セットにキャストせずに同じことを実現できます。

dict1.update((k, dict2[k]) for k in dict1.viewkeys() & dict2.viewkeys())

Python 3では、dictビューがデフォルトであるため、代わりに次のように綴ることができます。

dict1.update((k, dict2[k]) for k in dict1.keys() & dict2.keys())
于 2013-02-18T16:44:21.710 に答える
4

非破壊的:

dict((k, dict2.get(k, v)) for k, v in dict1.items())

変更dict1

dict1.update((k, v) for k, v in dict2.items() if k in dict1)
于 2013-02-18T16:44:47.217 に答える