Python'daki bir listeden ve boş değerden anahtarlarla bir diksiyon nasıl başlatılır?


251

Bundan almak istiyorum:

keys = [1,2,3]

buna:

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

Bunu yapmanın pitonik bir yolu var mı?

Bunu yapmanın çirkin bir yolu:

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

Yanıtlar:


390

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

Bu aslında bir sınıf metodu, bu yüzden de dict-subclass (gibi collections.defaultdict) için çalışıyor . İsteğe bağlı ikinci bağımsız değişken, tuşlar için kullanılacak değeri belirtir (varsayılan olarak None.)


154
Değişebilir bir şeye başlatırken dikkatli olun: Örneğin, ararsanız, dict.fromkeys([1, 2, 3], [])tüm tuşlar aynı listeye eşlenir ve bir tanesinin değiştirilmesi bunların tümünü değiştirir.
charleslparker

8
{k:[] for k in [1, 2, 3]}Bununla birlikte başlatma işlemi hala güvenlidir.
Aziz Alto

263

kimse bir diksiyon-anlama çözümü vermek umursamadı?

>>> 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
Ben 2.7'ye backported düşünüyoruz
wim

21
Bu güzel ve kabul edilen cevabın yaptığı referans sorundan muzdarip değil.
charleslparker

Bu aynı zamanda varsayılan bir değer atamanıza da izin verir (örn. False).
neverendingqs

Bu Python3 IMO
Bede Constantinides

4
Bir dict-comp kullanmak, değerin bir işlevi çağırmanın sonucu olmasını sağlar (istenirse anahtarı argüman olarak geçirilebilir) - bu çok güçlü bir mekanizmadır.
martineau


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

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

Çıktı:

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

1
Bu kod soruyu cevaplayabilse de, sorunun nasıl ve / veya neden çözüldüğü hakkında ek bağlam sağlamak yanıtlayıcının uzun vadeli değerini artıracaktır.
Francesco Menzani

4
keyDictkodun ilk satırı a setdeğil, a döndürdüğü için ad yanıltıcıdır dict.
Bryan Oakley

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

1
Neden Python gibi bir hata dışarı atmak vermez: TypeError: 'type' object is not iterable?
FaCoffee

1
@FrancescoCastellani Çünkü listbir tür. Eğer böyle bir şey yoksa list = [], yukarıdaki yöntem her zaman aynı hatayı verecektir
smac89

1

Gelen birçok Eğer keyfi anahtarları için varsayılan bir / başlangıç değeri eklemek istediğiniz iş akışları, değil mi gerek bireysel olarak önceden karma her tuşa. Kullanabilirsiniz collections.defaultdict. Örneğin:

from collections import defaultdict

d = defaultdict(lambda: None)

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

Bu daha verimlidir, tüm anahtarlarınızı somutlaştırmak zorunda kalmazsınız. Dahası, defaultdictbir alt sınıfıdır dict, bu yüzden genellikle normal bir sözlüğe geri dönmeye gerek yoktur.

İzin verilen tuşlar üzerinde kontroller gerektiren iş akışları dict.fromkeysiçin, kabul edilen cevaba göre kullanabilirsiniz:

d = dict.fromkeys([1, 2, 3, 4])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.