Saya ingin membuat kamus yang nilainya daftar. Sebagai contoh:
{
1: ['1'],
2: ['1','2'],
3: ['2']
}
Jika aku melakukan:
d = dict()
a = ['1', '2']
for i in a:
for j in range(int(i), int(i) + 2):
d[j].append(i)
Saya mendapatkan KeyError, karena d [...] bukan daftar. Dalam hal ini, saya dapat menambahkan kode berikut setelah penugasan a untuk menginisialisasi kamus.
for x in range(1, 4):
d[x] = list()
Apakah ada cara yang lebih baik untuk melakukan ini? Katakanlah saya tidak tahu kunci yang akan saya butuhkan sampai saya berada di for
loop kedua . Sebagai contoh:
class relation:
scope_list = list()
...
d = dict()
for relation in relation_list:
for scope_item in relation.scope_list:
d[scope_item].append(relation)
Alternatif kemudian akan diganti
d[scope_item].append(relation)
dengan
if d.has_key(scope_item):
d[scope_item].append(relation)
else:
d[scope_item] = [relation,]
Apa cara terbaik untuk menangani ini? Idealnya, menambahkan akan "hanya berfungsi". Apakah ada cara untuk menyatakan bahwa saya ingin kamus daftar kosong, bahkan jika saya tidak tahu setiap kunci ketika saya pertama kali membuat daftar?
python
dictionary
pengguna118662
sumber
sumber
collections
modul juga bekerja dengan cara ini, misalnyacollections.OrderedDict
.NameError: name 'a' is not defined
Anda dapat membangunnya dengan pemahaman daftar seperti ini:
Dan untuk bagian kedua dari pertanyaan Anda gunakan defaultdict
sumber
Anda bisa menggunakan
setdefault
:Yang agak aneh namanya
setdefault
"Dapatkan nilai dengan kunci ini, atau jika kunci itu tidak ada, tambahkan nilai ini dan kemudian kembalikan."Seperti yang orang lain tunjukkan dengan tepat,
defaultdict
adalah pilihan yang lebih baik dan lebih modern.setdefault
masih berguna dalam versi Python yang lebih lama (sebelum 2.5).sumber
Pertanyaan Anda telah dijawab, tetapi IIRC Anda dapat mengganti baris seperti:
dengan:
Artinya,
d
referensid.keys()
dalam konstruksi itu. Kadangdefaultdict
- kadang bukan pilihan terbaik (misalnya, jika Anda ingin mengeksekusi beberapa baris kode setelahelse
dikaitkan dengan di atasif
), dan saya menemukanin
sintaks lebih mudah dibaca.sumber
Secara pribadi, saya hanya menggunakan JSON untuk mengubah hal menjadi string dan kembali. String saya mengerti.
sumber
cara mudah adalah:
sumber