Upaya saya untuk membuat kamus daftar secara terprogram gagal mengizinkan saya untuk menangani kunci kamus satu per satu. Setiap kali saya membuat kamus daftar dan mencoba menambahkan ke satu kunci, semuanya diperbarui. Berikut kasus uji yang sangat sederhana:
data = {}
data = data.fromkeys(range(2),[])
data[1].append('hello')
print data
Hasil sebenarnya: {0: ['hello'], 1: ['hello']}
Hasil yang diharapkan: {0: [], 1: ['hello']}
Inilah yang berhasil
data = {0:[],1:[]}
data[1].append('hello')
print data
Hasil Aktual dan yang Diharapkan: {0: [], 1: ['hello']}
Mengapa fromkeys
metode ini tidak berfungsi seperti yang diharapkan?
sumber
fromkeys()
metode menerima fungsi pabrik, jadi kita bisa masuklist
sebagai fungsi, dan fungsi itu akan dipanggil sekali untuk setiap kunci yang dibuat, tapi itu bukan API sebenarnyadict.fromkeys()
.Gunakan defaultdict sebagai gantinya:
from collections import defaultdict data = defaultdict(list) data[1].append('hello')
Dengan cara ini Anda tidak perlu menginisialisasi semua kunci yang ingin Anda gunakan untuk membuat daftar sebelumnya.
Apa yang terjadi dalam contoh Anda adalah Anda menggunakan satu daftar (bisa berubah):
alist = [1] data = dict.fromkeys(range(2), alist) alist.append(2) print data
akan menghasilkan
{0: [1, 2], 1: [1, 2]}
.sumber
list
sini bukan daftar kosong, tetapi tipe (atau Anda dapat melihatnya sebagai konstruktor yang dapat dipanggil, saya kira). Jadi setiap kali kunci yang hilang dilewatkan, daftar baru dibuat alih-alih menggunakan kembali yang sama.Anda mengisi kamus Anda dengan referensi ke satu daftar sehingga saat Anda memperbaruinya, pembaruan akan tercermin di semua referensi. Cobalah pemahaman kamus sebagai gantinya. Lihat Membuat kamus dengan pemahaman daftar dengan Python
d = {k : v for k in blah blah blah}
sumber
v
jawaban ini?Anda bisa menggunakan ini:
data[:1] = ['hello']
sumber