Apakah ada cara untuk membuat defaultdict juga menjadi default untuk defaultdict? (Yaitu default default rekursif tingkat tak terbatas?)
Saya ingin dapat melakukan:
x = defaultdict(...stuff...)
x[0][1][0]
{}
Jadi, saya bisa melakukannya x = defaultdict(defaultdict)
, tetapi itu hanya level kedua:
x[0]
{}
x[0][0]
KeyError: 0
Ada resep yang bisa melakukan ini. Tetapi dapatkah itu dilakukan hanya dengan menggunakan argumen defaultdict yang normal?
Catatan ini menanyakan bagaimana cara melakukan defaultdict rekursif tingkat infinite, jadi berbeda dengan Python: defaultdict of defaultdict? , yang merupakan cara melakukan defaultdict dua tingkat.
Saya mungkin hanya akan berakhir menggunakan pola tandan , tetapi ketika saya menyadari saya tidak tahu bagaimana melakukan ini, itu membuat saya tertarik.
python
recursion
defaultdict
Corley Brigman
sumber
sumber
Jawaban:
Untuk jumlah level yang berubah-ubah:
Tentu saja Anda juga bisa melakukan ini dengan lambda, tetapi saya menemukan lambda kurang bisa dibaca. Bagaimanapun akan terlihat seperti ini:
sumber
lambda
tidak akan berhasil.Jawaban lain di sini memberi tahu Anda cara membuat
defaultdict
yang berisi "tak terhingga banyaknya"defaultdict
, tetapi mereka gagal menjawab apa yang saya pikir mungkin adalah kebutuhan awal Anda yang hanya memiliki standar default dua kedalaman.Anda mungkin telah mencari:
Alasan mengapa Anda lebih suka konstruksi ini adalah:
defaultdict
menjadi sesuatu selain dari kamus, misalnya ,:defaultdict(lambda: defaultdict(list))
ataudefaultdict(lambda: defaultdict(set))
sumber
lambda
formnya benar - karenadefaultdict(something)
mengembalikan objek seperti kamus, tetapidefaultdict
mengharapkan callable! Terima kasih!dict(result)
sebelum acarAda trik bagus untuk melakukan itu:
Kemudian Anda bisa membuatnya
x
denganx = tree()
.sumber
Mirip dengan solusi BrenBarn, tetapi tidak mengandung nama variabel
tree
dua kali, sehingga berfungsi bahkan setelah perubahan ke kamus variabel:Kemudian Anda dapat membuat masing-masing
x
denganx = tree()
.Untuk
def
versi, kita bisa menggunakan lingkup penutupan fungsi untuk melindungi struktur data dari cacat di mana instans yang ada berhenti bekerja jikatree
namanya kembali. Ini terlihat seperti ini:sumber
Saya juga akan mengusulkan implementasi lebih banyak gaya OOP, yang mendukung bersarang tanpa batas serta diformat dengan benar
repr
.Pemakaian:
sumber
*args
dan**kwargs
yang memungkinkannya berfungsi sepertidefaultdict
, yaitu membuat dict dengan argumen kata kunci. Ini berguna untuk melintasNestedDefaultDict
kejson.load
di sini adalah fungsi rekursif untuk mengubah dict default rekursif ke dict normal
sumber
Saya mendasarkan jawaban Andrew ini di sini. Jika Anda mencari untuk memuat data dari json atau dikt yang ada ke dalam nerd defaultdict lihat contoh ini:
https://gist.github.com/nucklehead/2d29628bb49115f3c30e78c071207775
sumber