Pythonでリストのキーと空の値でdictを初期化する方法は?


251

私はこれから得たいです:

keys = [1,2,3]

これに:

{1: None, 2: None, 3: None}

それを行うためのpythonicな方法はありますか?

これは醜い方法です:

>>> keys = [1,2,3]
>>> dict([(1,2)])
{1: 2}
>>> dict(zip(keys, [None]*len(keys)))
{1: None, 2: None, 3: None}

回答:


389

dict.fromkeys([1, 2, 3, 4])

これは実際にはクラスメソッドであるため、dictサブクラス(などcollections.defaultdict)でも機能します。オプションの2番目の引数は、キーに使用する値を指定します(デフォルトはNone)。


153
変更可能なものへの初期化には注意してください。たとえば、を呼び出すとdict.fromkeys([1, 2, 3], [])、すべてのキーが同じリストにマッピングされ、1つを変更するとすべてが変更されます。
charleslparker 2013年

8
{k:[] for k in [1, 2, 3]}でも初期化は安全です。
Aziz Alto

263

辞書を理解するための解決策を誰も気にしませんか?

>>> keys = [1,2,3,5,6,7]
>>> {key: None for key in keys}
{1: None, 2: None, 3: None, 5: None, 6: None, 7: None}

32
私は、それが2.7にバックポートされたと考えている
WIM

21
これはいいことであり、受け入れられた回答が行う参照の問題に悩まされることはありません。
charleslparker 2013年

これにより、デフォルト値(などFalse)を割り当てることもできます。
neverendingqs 2015

これはPython3 IMOで最もクリーンで最もPython的な方法です
Bede Constantinides

4
dict-compを使用すると、値を関数呼び出しの結果にすることもできます(必要に応じて、引数としてキーを渡すことができます)。これは非常に強力なメカニズムです。
martineau 2015


16
>>> keyDict = {"a","b","c","d"}

>>> dict([(key, []) for key in keyDict])

出力:

{'a': [], 'c': [], 'b': [], 'd': []}

1
このコードは質問に答えることがありますが、問題を解決する方法および/または理由に関する追加のコンテキストを提供すると、回答の長期的な価値が向上します。
Francesco Menzani 2015

4
keyDictコードの最初の行がsetでなくを返すため、名前は誤解を招く可能性がありますdict
ブライアンオークリー2016年

10
d = {}
for i in keys:
    d[i] = None

1
なぜPythonは次のようなエラーをスローするのTypeError: 'type' object is not iterableですか?
FaCoffee、2015年

1
@FrancescoCastellani listタイプですので。のようなものがない限りlist = []、上記の方法では常に同じエラーが発生します
smac89

1

では、多くのあなたは、任意のキーのデフォルト/初期値を添付したいワークフロー、あなたはしていない必要がある個別に事前に各キーをハッシュします。使用できますcollections.defaultdict。例えば:

from collections import defaultdict

d = defaultdict(lambda: None)

print(d[1])  # None
print(d[2])  # None
print(d[3])  # None

これはより効率的で、インスタンス化時にすべてのキーをハッシュする必要がなくなります。さらに、defaultdictはのサブクラスなdictので、通常の辞書に戻す必要は通常ありません。

許可されたキーの制御を必要とするワークフローではdict.fromkeys、受け入れられた回答に従って使用できます。

d = dict.fromkeys([1, 2, 3, 4])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.