Bir defaultdict'i nasıl dönüştürebilirim
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
ortak bir diktedir?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
Bir defaultdict'i nasıl dönüştürebilirim
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
ortak bir diktedir?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
Yanıtlar:
Sadece arayabilirsin dict
:
>>> a
defaultdict(<type 'list'>, {'1': ['b', 'a'], '3': ['b'], '2': ['a']})
>>> dict(a)
{'1': ['b', 'a'], '3': ['b'], '2': ['a']}
ancak bir varsayılan diktenin bir dikt olduğunu unutmayın :
>>> isinstance(a, dict)
True
sadece biraz farklı bir davranışla, eksik olan bir anahtara erişmeye çalıştığınızda - ki bu normalde a'yı yükseltir KeyError
- default_factory
onun yerine çağrılır:
>>> a.default_factory
<type 'list'>
print a
Sözlüğün veri tarafı görünmeden önce gördüğünüz şey budur .
Dolayısıyla, aslında yeni bir nesne oluşturmadan daha dikte benzeri davranışı geri almanın bir başka yolu, sıfırlamaktır default_factory
:
>>> a.default_factory = None
>>> a[4].append(10)
Traceback (most recent call last):
File "<ipython-input-6-0721ca19bee1>", line 1, in <module>
a[4].append(10)
KeyError: 4
ama çoğu zaman bu zahmete değmez.
default_factory
? Neler olduğu hakkında hiçbir fikrim yok. Afedersiniz.
default_factory
- bu defaultdict
, defaultdict(int)
veya gibi, ilk etapta yaptığınızda geçtiğiniz işlevdir defaultdict(list)
. Her zaman sözlükte bir anahtar aramaya çalıştığınızda a['3']
, örneğin normal bir sözlükte ya değeri alırsınız ya da bir KeyError
istisna yaratır (bir hata gibi, o anahtarı bulamadığını söyler). Ancak defaultdict
a'da, sizin için yeni bir varsayılan değer (bu "varsayılan" değerdir) yapmak için default_factory
işlevi çağırır . defaultdict
pickle
olamaz kolu (bir dosyaya piton objelerin kaydedileceği) defaultdict
s birçok durumda .
Varsayılan diktiniz yinelemeli olarak tanımlandıysa, örneğin:
from collections import defaultdict
recurddict = lambda: defaultdict(recurddict)
data = recurddict()
data["hello"] = "world"
data["good"]["day"] = True
defaultdict'i tekrar dikteye dönüştürmenin bir başka basit yolu, json
modülü kullanmaktır
import json
data = json.loads(json.dumps(data))
ve tabii ki, varsayılan yetkinizde bulunan değerlerin json tarafından desteklenen veri türleriyle sınırlandırılması gerekir, ancak sınıfları veya işlevleri diktede saklamayı düşünmüyorsanız sorun olmamalıdır.
Hatta bir özyinelemeli dönüştürmek için bir özyinelemeli sürümünü isterseniz defaultdict
bir karşı dict
aşağıdakileri deneyebilirsiniz:
#! /usr/bin/env python3
from collections import defaultdict
def ddict():
return defaultdict(ddict)
def ddict2dict(d):
for k, v in d.items():
if isinstance(v, dict):
d[k] = ddict2dict(v)
return dict(d)
myddict = ddict()
myddict["a"]["b"]["c"] = "value"
print(myddict)
mydict = ddict2dict(myddict)
print(mydict)
defaultdict(lambda: defaultdict(int))
): {k: dict(v) for k, v in foo.items()}
dict(number_to_letter)