Saya telah membaca contoh-contoh dalam python docs, tetapi masih tidak tahu apa arti metode ini. Adakah yang bisa membantu? Berikut adalah dua contoh dari python docs
>>> from collections import defaultdict
>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
... d[k] += 1
...
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]
dan
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
... d[k].append(v)
...
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
parameter int
dan list
untuk apa?
python
dictionary
default-value
defaultdict
Lanston
sumber
sumber
default_factory = None
setelah Anda selesai mengisi defaultdict tersebut. Lihat pertanyaan ini .Jawaban:
Biasanya, kamus Python melempar
KeyError
jika Anda mencoba untuk mendapatkan item dengan kunci yang saat ini tidak ada dalam kamus. Thedefaultdict
kontras hanya akan menciptakan setiap item yang Anda mencoba untuk mengakses (yang tentu saja mereka tidak ada). Untuk membuat item "default" tersebut, ia memanggil objek fungsi yang Anda berikan ke konstruktor (lebih tepatnya, itu adalah objek "callable" yang sewenang-wenang, yang mencakup objek fungsi dan ketik). Untuk contoh pertama, item default dibuat menggunakanint()
, yang akan mengembalikan objek integer0
. Untuk contoh kedua, item default dibuat menggunakanlist()
, yang mengembalikan objek daftar kosong baru.sumber
d.get(key, default)
tidak akan pernah memodifikasi kamus Anda - itu hanya akan mengembalikan default dan membiarkan kamus tidak berubah.defaultdict
, di sisi lain, akan memasukkan kunci ke kamus jika belum ada di sana. Ini perbedaan besar; lihat contoh-contoh dalam pertanyaan untuk memahami mengapa.defaultdict
memanggil konstruktor apa pun yang Anda lewati. Jika Anda memasukkan tipeT
, nilai akan dibangun menggunakanT()
. Tidak semua jenis dapat dibangun tanpa melewati parameter apa pun. Jika Anda ingin membuat tipe seperti itu, Anda memerlukan fungsi wrapper, atau semacamnyafunctools.partial(T, arg1, arg2)
.defaultdict
berarti bahwa jika kunci tidak ditemukan dalam kamus, maka alih-alihKeyError
dilempar, entri baru dibuat. Jenis entri baru ini diberikan oleh argumen defaultdict.Sebagai contoh:
sumber
0
integer, jikasomeddict = defaultdict(list)
itu mengembalikannya[ ]
. Apakah 0 bilangan bulat default? Atau [] daftar default?0
tidak dapat diubah - dalam CPython semua nilai dari-5
hingga di256
-cache lajang tetapi ini adalah perilaku khusus-implementasi - dalam kedua kasus instance baru "dibuat" setiap kali denganint()
ataulist()
. Dengan begitu,d[k].append(v)
dapat bekerja tanpa mengisi kamus dengan referensi ke daftar yang sama, yang akan membuatdefaultdict
hampir tidak berguna. Jika ini adalah perilaku,defaultdict
akan mengambil nilai, bukan lambda, sebagai parameter. (Maaf untuk penjelasan yang mengerikan!)defaultdict
"Kamus standar mencakup metode setdefault () untuk mengambil nilai dan menetapkan default jika nilai tidak ada. Sebaliknya,
defaultdict
memungkinkan penelepon menentukan default (nilai yang akan dikembalikan) di depan ketika wadah diinisialisasi."seperti yang didefinisikan oleh Doug Hellmann di The Python Standard Library by Example
Cara menggunakan defaultdict
Impor defaultdict
Inisialisasi defaultdict
Inisialisasi dengan melewati
atau
Bagaimana cara kerjanya
Seperti kamus anak standar, kamus ini dapat melakukan semua fungsi yang sama.
Tetapi jika melewati kunci yang tidak dikenal itu mengembalikan nilai default bukannya kesalahan. Misalnya:
Jika Anda ingin mengubah nilai default, timpa default_factory:
atau
Contoh dalam Pertanyaan
Contoh 1
Karena int telah diteruskan sebagai default_factory, kunci apa pun yang tidak dikenal akan mengembalikan 0 secara default.
Sekarang ketika string dilewatkan dalam loop, itu akan meningkatkan jumlah huruf-huruf itu di d.
Contoh 2
Karena daftar telah diteruskan sebagai default_factory, kunci apa pun yang tidak dikenal (tidak ada) akan mengembalikan [] (mis. Daftar) secara default.
Sekarang karena daftar tuple dilewatkan dalam loop, itu akan menambahkan nilai dalam d [warna]
sumber
Kamus adalah cara mudah untuk menyimpan data untuk pengambilan nanti dengan nama (kunci). Kunci harus berupa benda unik dan tidak dapat diubah, dan biasanya berupa string. Nilai dalam kamus bisa berupa apa saja. Untuk banyak aplikasi, nilainya adalah tipe sederhana seperti bilangan bulat dan string.
Semakin menarik ketika nilai-nilai dalam kamus adalah koleksi (daftar, dikte, dll.) Dalam hal ini, nilai (daftar kosong atau dikt) harus diinisialisasi saat pertama kali kunci yang diberikan digunakan. Walaupun ini relatif mudah dilakukan secara manual, tipe defaultdict mengotomatiskan dan menyederhanakan jenis operasi ini. Defaultdict berfungsi persis seperti dict normal, tetapi diinisialisasi dengan fungsi ("pabrik default") yang tidak menggunakan argumen dan memberikan nilai default untuk kunci yang tidak ada.
Sebuah defaultdict tidak akan pernah meningkatkan KeyError. Kunci apa pun yang tidak ada mendapat nilai yang dikembalikan oleh pabrik default.
Berikut adalah contoh lain tentang Bagaimana menggunakan defaultdict, kita dapat mengurangi kompleksitas
Kesimpulannya, setiap kali Anda membutuhkan kamus, dan nilai setiap elemen harus dimulai dengan nilai default, gunakan defaultdict.
sumber
Ada penjelasan yang bagus tentang defaultdicts di sini: http://ludovf.net/blog/python-collections-defaultdict/
Pada dasarnya, parameter int dan daftar adalah fungsi yang Anda lewati. Ingat bahwa Python menerima nama fungsi sebagai argumen. int mengembalikan 0 secara default dan daftar mengembalikan daftar kosong ketika dipanggil dengan tanda kurung.
Dalam kamus normal, jika dalam contoh Anda saya mencoba menelepon
d[a]
, saya akan mendapatkan kesalahan (KeyError), karena hanya kunci m, s, i dan p ada dan kunci a belum diinisialisasi. Tetapi dalam defaultdict, dibutuhkan nama fungsi sebagai argumen, ketika Anda mencoba menggunakan kunci yang belum diinisialisasi, itu hanya memanggil fungsi yang Anda berikan dan menetapkan nilai kembali sebagai nilai kunci baru.sumber
Karena pertanyaannya adalah tentang "cara kerjanya", beberapa pembaca mungkin ingin melihat lebih banyak mur dan baut. Secara khusus, metode yang dimaksud adalah
__missing__(key)
metode. Lihat: https://docs.python.org/2/library/collections.html#defaultdict-objects .Lebih konkret, jawaban ini menunjukkan cara memanfaatkan
__missing__(key)
dengan cara praktis: https://stackoverflow.com/a/17956989/1593924Untuk mengklarifikasi apa arti 'callable', berikut adalah sesi interaktif (dari 2.7.6 tetapi juga bisa digunakan di v3):
Itu adalah penggunaan defaultdict yang paling umum (kecuali untuk penggunaan variabel x yang tidak berguna). Anda dapat melakukan hal yang sama dengan 0 sebagai nilai default eksplisit, tetapi tidak dengan nilai sederhana:
Alih-alih, yang berikut ini berfungsi karena lewat dalam fungsi sederhana (ia membuat fungsi tanpa nama yang membuat tanpa argumen dan selalu mengembalikan 0):
Dan dengan nilai default yang berbeda:
sumber
My 2 2 sendiri: Anda juga dapat subkelas defaultdict:
Ini bisa berguna untuk kasus yang sangat kompleks.
sumber
Perilaku
defaultdict
dapat dengan mudah ditiru menggunakandict.setdefault
alih-alihd[key]
dalam setiap panggilan.Dengan kata lain, kodenya:
setara dengan:
Satu-satunya perbedaan adalah bahwa, menggunakan
defaultdict
, daftar konstruktor dipanggil hanya sekali, dan menggunakandict.setdefault
daftar konstruktor disebut lebih sering (tetapi kode dapat ditulis ulang untuk menghindari ini, jika benar-benar diperlukan).Beberapa mungkin berpendapat ada pertimbangan kinerja, tetapi topik ini adalah ladang ranjau. Posting ini menunjukkan tidak ada keuntungan kinerja besar dalam menggunakan defaultdict, misalnya.
IMO, defaultdict adalah koleksi yang menambahkan lebih banyak kebingungan daripada manfaat kode. Tidak berguna bagi saya, tetapi orang lain mungkin berpikir berbeda.
sumber
Alat defaultdict adalah wadah di kelas koleksi Python. Ini mirip dengan wadah kamus (dikt) biasa, tetapi memiliki satu perbedaan: Tipe data bidang nilai ditentukan saat inisialisasi.
Sebagai contoh:
Ini mencetak:
sumber
list
adalah fungsi untuk memanggil untuk mengisi nilai yang hilang, bukan jenis objek yang akan dibuat. Misalnya, untuk memiliki nilai default1
, Anda akan menggunakanlambda:1
yang jelas bukan tipe.Saya pikir yang terbaik digunakan sebagai pengganti pernyataan kasus saklar. Bayangkan jika kita memiliki pernyataan kasus sakelar seperti di bawah ini:
Tidak ada
switch
pernyataan kasus yang tersedia dalam python. Kita dapat mencapai hal yang sama dengan menggunakandefaultdict
.Mencetak:
Dalam cuplikan di atas
dd
tidak memiliki tombol 4 atau 5 dan karenanya mencetak nilai default yang telah kami konfigurasikan dalam fungsi pembantu. Ini lebih bagus daripada kamus mentah di mana aKeyError
dilemparkan jika kunci tidak ada. Dari sini terbukti bahwadefaultdict
lebih seperti pernyataan kasus saklar di mana kita dapat menghindariif-elif-elif-else
blok yang rumit .Satu lagi contoh bagus yang sangat mengesankan saya dari situs ini adalah:
Jika kami mencoba mengakses item apa pun selain
eggs
danspam
kami akan mendapatkan hitungan 0.sumber
Tanpa
defaultdict
, Anda mungkin dapat menetapkan nilai baru untuk kunci yang tidak terlihat tetapi Anda tidak dapat memodifikasinya. Sebagai contoh:sumber
Yah, defaultdict juga dapat meningkatkan keyerror dalam kasus berikut:
Selalu ingat untuk memberikan argumen ke defaultdict seperti defaultdict (int).
sumber
Kamus standar mencakup metode setdefault () untuk mengambil nilai dan menetapkan default jika nilai tidak ada. Sebaliknya, defaultdict memungkinkan penelepon menentukan default di depan ketika wadah diinisialisasi.
Ini berfungsi dengan baik selama semua kunci memiliki standar yang sama. Ini bisa sangat berguna jika default adalah tipe yang digunakan untuk mengumpulkan atau mengumpulkan nilai-nilai, seperti daftar, set, atau bahkan int. Dokumentasi perpustakaan standar mencakup beberapa contoh penggunaan defaultdict dengan cara ini.
sumber
Pendeknya:
defaultdict(int)
- argumen int menunjukkan bahwa nilai-nilai akan menjadi tipe int.defaultdict(list)
- daftar argumen menunjukkan bahwa nilai akan menjadi tipe daftar.sumber
Dokumentasi dan penjelasannya cukup jelas:
http://docs.python.org/library/collections.html#collections.defaultdict
Fungsi tipe (int / str dll.) Yang dikirimkan sebagai argumen digunakan untuk menginisialisasi nilai default untuk setiap kunci yang diberikan di mana kunci tersebut tidak ada dalam dikt.
sumber