Saya mengikuti buku 'Ilmu Data dari Awal' dan ini adalah sepotong kode di dalamnya:

dd_pair = defaultdict(lambda: [0, 0])
dd_pair[2][1] = 1                       # now dd_pair contains {2: [0, 1]}

Dapatkah seseorang tolong bantu saya memahami mengapa dan bagaimana cara kerjanya?

0
Tom 17 April 2020, 18:15

1 menjawab

Jawaban Terbaik

defaultdict mengambil tipe data sebagai penginisialisasi. Mari kita anggap kita memiliki kamus yang disebut "pengguna" dengan "ID" sebagai kunci dan daftar sebagai nilai. Kami harus memeriksa apakah "ID" ada di kamus, jika ya kami menambahkan sesuatu ke daftar, jika tidak kami meletakkan daftar kosong di tempat itu.

Jadi dengan kamus biasa, kami melakukan sesuatu seperti:

users = {}

if "id1" not in users:
    users["id1"] = []
users["id1"].append("log")

Sekarang dengan defaultdict, yang harus kita lakukan adalah mengatur penginisialisasi sebagai:

from collections import defaultdict
users = defaultdict(list)  # Any key not existing in the dictionary will get assigned a `list()` object, which is an empty list
users["id1"].append("log")

Jadi datang ke kode Anda,

dd_pair = defaultdict(lambda: [0, 0])

Ini mengatakan, kunci apa pun yang tidak ada di dd_pair akan mendapatkan daftar dua elemen yang diinisialisasi ke 0 sebagai nilai awalnya. Jadi jika Anda hanya melakukan print(dd_pair["somerandomkey"]) itu akan mencetak [0,0].

Oleh karena itu, dd_pair[2][1] diterjemahkan secara kasar menjadi seperti ini:

dd_pair[2] = [0,0] # dd_pair looks like: {2:[0,0]}
dd_pair[2][1] = 1  # dd_pair looks like: {2:[0,1]}

Mengapa perlu lambda, mengapa tidak menggunakan [0,0] saja?

Konstruktor defaultdict mengharapkan callable (Konstruktor sebenarnya mengharapkan default_factory, lihat Python dokumen). Dalam istilah yang sangat sederhana, jika kita melakukan defaultdict(somevar), somevar() seharusnya valid.

Jadi, jika Anda hanya meneruskan [0,0] ke defaultdict itu akan salah karena [0,0]() tidak valid sama sekali. Jadi yang Anda butuhkan adalah fungsi yang mengembalikan [0,0], yang dapat diimplementasikan dengan mudah menggunakan lambda:[0,0]. (Untuk memverifikasi, lakukan saja (lambda:[0,0])() , itu akan mengembalikan [0,0]).

Satu cara lagi adalah membuat kelas untuk tipe spesifik Anda, yang lebih baik dijelaskan dalam jawaban ini: https://stackoverflow.com/a/ 36320098/

1
Rahul Bharadwaj 18 April 2020, 05:22