Bagaimana cara mengonversi defaultdict
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
menjadi perintah umum?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
Bagaimana cara mengonversi defaultdict
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
menjadi perintah umum?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
Jawaban:
Anda cukup menelepon dict
:
>>> a
defaultdict(<type 'list'>, {'1': ['b', 'a'], '3': ['b'], '2': ['a']})
>>> dict(a)
{'1': ['b', 'a'], '3': ['b'], '2': ['a']}
tapi ingat bahwa defaultdict adalah sebuah dict:
>>> isinstance(a, dict)
True
hanya dengan perilaku yang sedikit berbeda, ketika Anda mencoba mengakses kunci yang hilang - yang biasanya akan memunculkan KeyError
- yang default_factory
dipanggil sebagai gantinya:
>>> a.default_factory
<type 'list'>
Itulah yang Anda lihat saat Anda print a
sebelum sisi data kamus muncul.
Jadi trik lain untuk mendapatkan kembali perilaku seperti diktik tanpa benar-benar membuat objek baru adalah dengan mengatur ulang 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
tetapi seringkali hal ini tidak sebanding dengan masalahnya.
default_factory
? Saya hanya tidak tahu apa yang sedang terjadi. Maaf.
default_factory
- itulah fungsi yang Anda berikan defaultdict
saat pertama kali membuat, seperti defaultdict(int)
atau defaultdict(list)
. Setiap kali Anda mencoba mencari kunci di kamus, seperti a['3']
, misalnya, dalam kamus biasa Anda akan mendapatkan nilainya atau memunculkan KeyError
pengecualian (seperti kesalahan, memberi tahu Anda bahwa kunci itu tidak dapat ditemukan). Tapi di a defaultdict
, itu malah memanggil default_factory
fungsi untuk membuat nilai default baru (itulah "default" di defaultdict
) untuk Anda.
pickle
(untuk menyimpan objek python ke file) tidak dapat menangani defaultdict
s dalam banyak keadaan .
Jika defaultdict Anda ditentukan secara rekursif, misalnya:
from collections import defaultdict
recurddict = lambda: defaultdict(recurddict)
data = recurddict()
data["hello"] = "world"
data["good"]["day"] = True
cara sederhana lain untuk mengubah defaultdict kembali ke dict adalah dengan menggunakan json
modul
import json
data = json.loads(json.dumps(data))
dan tentu saja, nilai yang dimuat dalam defaultdict Anda perlu dibatasi pada tipe data yang didukung json, tetapi seharusnya tidak menjadi masalah jika Anda tidak bermaksud untuk menyimpan kelas atau fungsi di dict.
Jika Anda bahkan menginginkan versi rekursif untuk mengubah rekursif defaultdict
menjadi dict
Anda dapat mencoba yang berikut:
#! /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)