別の辞書で辞書を拡張するための最良の方法はどれですか?例えば:
>>> a = { "a" : 1, "b" : 2 }
>>> b = { "c" : 3, "d" : 4 }
>>> a
{'a': 1, 'b': 2}
>>> b
{'c': 3, 'd': 4}
for
ループを回避してこれを取得するための操作を探しています。
{ "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
私は何かをしたいのですが。
a.extend(b) # This does not work
a.update(b)
どちらの入力ディジットも変えない「oneliner way」は、
basket = dict(basket_one, **basket_two)
**basket_two
(**
)がここで何を意味するのかを学びましょう 。
矛盾がある場合は、basket_two
の項目がbasket_one
の項目をオーバーライドします。一行に行くと、これはかなり読みやすく、透明であり、他の2つが混在している辞書が便利になるときはいつでもそれを使用することに反対するようなことはありません。これがdict
と**
フォームについて学ぶことを促す方法です;-)。したがって、たとえば、次のように使用します。
x = mungesomedict(dict(adict, **anotherdict))
私のコードではかなり頻繁に発生します。
当初の投稿者= Alex Martelli
注:Python 3では、これはbasket_two内のすべてのキーがstring
である場合にのみ機能します。
辞書マッピングで辞書内包表記を使用してみましたか。
c = {**a, **b}
# c = { "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
a.update(b)
bからaまでのキーと値を追加します。すでにキーの値がある場合は上書きします。
他の人が言ったように、いくつかのa
とb
のためのa.update(b)
はあなたがあなたの質問であなたが求めた結果を達成するでしょう。しかし、extend
メソッドでオブジェクトをマッピング/設定する方法で、a.extend(b)
のa
の値をb
の値で上書きしてはいけないことを望んでいることを何度も指摘したいと思います。 a.update(b)
はa
の値を上書きするので、extend
には適していません。
このメソッドをdefaults
またはinject
と呼ぶ言語があることに注意してください。これは、存在する可能性のある値を上書きせずにbの値(デフォルト値のセットになる可能性がある)を辞書に注入する方法と考えることができます。
もちろん、a.extend(b)
はb.update(a); a=b
とほぼ同じです。割り当てを削除するには、次のようにします。
def extend(a,b):
"""Create a new dictionary with a's properties extended by b,
without overwriting.
>>> extend({'a':1,'b':2},{'b':3,'c':4})
{'a': 1, 'c': 4, 'b': 2}
"""
return dict(b,**a)
dict
に副作用のないextend
コンストラクタを使用したスマートなアイデアを提供してくれたTom Leysに感謝します。
Python 3.3で導入されたpythonの collections.Chainmap を使うこともできます。
from collections import Chainmap
c = Chainmap(a, b)
c['a'] # returns 1
ユースケースに応じて、これにはいくつかの利点があります。それらはより詳細に説明されています ここ 、しかし私は簡単な概要を述べるつもりです:
これは主に設定辞書のようなものに役立ちます。