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']}
python
defaultdict
pengguna2988464
sumber
sumber
dict(number_to_letter)
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
- yangdefault_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.
sumber
default_factory
? Saya hanya tidak tahu apa yang sedang terjadi. Maaf.default_factory
- itulah fungsi yang Anda berikandefaultdict
saat pertama kali membuat, sepertidefaultdict(int)
ataudefaultdict(list)
. Setiap kali Anda mencoba mencari kunci di kamus, sepertia['3']
, misalnya, dalam kamus biasa Anda akan mendapatkan nilainya atau memunculkanKeyError
pengecualian (seperti kesalahan, memberi tahu Anda bahwa kunci itu tidak dapat ditemukan). Tapi di adefaultdict
, itu malah memanggildefault_factory
fungsi untuk membuat nilai default baru (itulah "default" didefaultdict
) untuk Anda.pickle
(untuk menyimpan objek python ke file) tidak dapat menanganidefaultdict
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
modulimport 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.
sumber
Jika Anda bahkan menginginkan versi rekursif untuk mengubah rekursif
defaultdict
menjadidict
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)
sumber
defaultdict(lambda: defaultdict(int))
):{k: dict(v) for k, v in foo.items()}