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_factoryonun yerine çağrılır:
>>> a.default_factory
<type 'list'>
print aSö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 KeyErroristisna yaratır (bir hata gibi, o anahtarı bulamadığını söyler). Ancak defaultdicta'da, sizin için yeni bir varsayılan değer (bu "varsayılan" değerdir) yapmak için default_factoryişlevi çağırır . defaultdict
pickleolamaz kolu (bir dosyaya piton objelerin kaydedileceği) defaultdicts 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, jsonmodü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 defaultdictbir karşı dictaş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)