2016-04-22 10 views
1

辞書に特定のキーがあると想定しているとします。欠落している場合、これらの特定のキーをデフォルト値で追加する簡単な方法はありますか?例えばデフォルトのキーでpython dictを更新する方法:別のdictで指定された値のペア

dの元の値が保持されるだけ欠落キーが追加される場合

default_dict = {'name': '', 'height': 100, 'age': 20} 

d = {'name': 'James', 'age': 65} 
d.set_defaults(default_dict) 

{'name': 'James', 'age': 65, 'height': 100} 

に辞書dを更新するであろう。

default_dictは処理中に破棄しないでください。

+0

ちょうど別の方法で – njzk2

+1

@ njzk2を更新してください。「default_dict」は破棄しないでください。 – Miguel

+0

コピーを – njzk2

答えて

3

、私は辞書のsetdefaultメソッドを使用する場合がありますキーの数が少なければ、私はおそらくMartijnによって投稿されたソリューションのラインに沿って何かをやるでしょう。

4

デフォルトのコピーを作成し、dで更新します。 d内のすべてのキーが文字列である場合、あなたは1回のdict()呼び出しでそうすることができます。

d = default_dict.copy() 
d.update({'name': 'James', 'age': 65}) 

またはあなたが使用できます。非文字列のキーを持つ辞書用

​​

、次の2つの手順を使用したいです辞書ビューを使用してキーが存在しない場合、dを更新するループ。しかし、これは早くないです

d = {**default_dict, 'name': 'James', 'age': 65} 

d = {'name': 'James', 'age': 65} 
d.update((k, default_dict[v]) for k in default_dict.viewkeys() - d) 

あなたは新しい辞書を作成するためのPython 3.5以降、あなたが同様の構文を使用することができますを使用している場合はPython 3

keysviewkeysを交換してください

default_dictのキーと値のペアが最初に適用され、続いて新しいキーが適用されます。これらは古いものを上書きします。 3.5 What's NewのドキュメントのPEP 448 - Additional Unpacking Generalizationsを参照してください。

新しい辞書を作成する方法のいずれも、単にdict.update()呼び出しでラップするだけで、既存の辞書を更新することができます。だから、最初はとインプレースdを更新できます。私は私が持っていた新しい辞書を作成していた場合

for key, value in dict_of_defaults.items(): 
    dict_maybe_without_defaults.setdefault(key, value) 

:既存の辞書を更新するには

d.update(dict(default_dict, **d)) 
+2

3.5で実行すると、これは '{** default_dict、** d}'として実行することもでき、文字列キーに制限はありません。 – user2357112

+0

@ user2357112:もう一度文書を検索していました。これは 'd 'のリテラルに直接適用すると最も簡単です。 –

+0

Guidoが 'dict(mapping、** othermapping)'を "卑劣な"と呼んでいるインターネット上のどこかにコメントがあることは間違いないと思います - おそらく彼はそれ以来彼の立場を緩めていますか? http://stackoverflow.com/a/26853961/748858 – mgilson

1

あなたは、フォールバックを関連付けるcollections.ChainMapを使用して検討してください。

import collections 

default_dict = {'name': '', 'height': 100, 'age': 20} 

d = collections.ChainMap({'name': 'James', 'age': 65},default_dict) 

>>> d 
ChainMap({'name': 'James', 'age': 65}, {'name': '', 'height': 100, 'age': 20}) 
>>> dict(d) #this flattens the map but isn't necessary for it to work 
{'name': 'James', 'height': 100, 'age': 65} 

はまた、すべての変異メソッドは、最初のマッピングを変更しますので、default_dictpopまたは他の方法から安全であることに注意してください。

関連する問題