Saya agak bingung dengan kode berikut:
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
print key, 'corresponds to', d[key]
Yang tidak saya mengerti adalah key
porsinya. Bagaimana Python mengenali bahwa itu hanya perlu membaca kunci dari kamus? Apakah key
ada kata khusus dalam Python? Atau itu hanya variabel?
python
python-2.7
dictionary
TopChef
sumber
sumber
Jawaban:
key
hanya nama variabel.hanya akan mengulangi kunci dalam kamus, bukan kunci dan nilai. Untuk mengulangi kedua kunci dan nilai Anda dapat menggunakan yang berikut:
Untuk Python 3.x:
Untuk Python 2.x:
Untuk menguji sendiri, ubah kata
key
menjadipoop
.Dalam Python 3.x,
iteritems()
diganti dengan sederhanaitems()
, yang mengembalikan tampilan seperti set yang didukung oleh dikt, sepertiiteritems()
tetapi lebih baik. Ini juga tersedia dalam 2,7 sebagaiviewitems()
.Operasi
items()
akan bekerja untuk 2 dan 3, tetapi di 2 akan mengembalikan daftar(key, value)
pasangan kamus , yang tidak akan mencerminkan perubahan pada dikt yang terjadi setelahitems()
panggilan. Jika Anda menginginkan perilaku 2.x dalam 3.x, Anda dapat meneleponlist(d.items())
.sumber
sorted
diperlukan untuk menstabilkannya.Keys and values are iterated over in insertion order.
[ docs.python.org/3/library/…Bukan itu kuncinya adalah kata khusus, tetapi kamus mengimplementasikan protokol iterator. Anda dapat melakukan ini di kelas Anda, mis. Lihat pertanyaan ini untuk bagaimana membangun iterator kelas.
Dalam kasus kamus, ini diimplementasikan pada tingkat C. Rinciannya tersedia di PEP 234 . Secara khusus, bagian berjudul "Kamus Kamus":
Dalam Python 3
dict.iterkeys()
,,dict.itervalues()
dandict.iteritems()
tidak lagi didukung. Gunakandict.keys()
,dict.values()
dandict.items()
sebagai gantinya.sumber
Iterasi melalui
dict
iterasi melalui kuncinya tanpa urutan tertentu, seperti yang Anda lihat di sini:Sunting: (Ini bukan lagi kasus di Python3.6 , tetapi perhatikan bahwa itu belum dijamin perilaku)
Sebagai contoh Anda, ini adalah ide yang lebih baik untuk digunakan
dict.items()
:Ini memberi Anda daftar tupel. Ketika Anda mengulanginya seperti ini, setiap tuple dibongkar
k
danv
secara otomatis:Menggunakan
k
danv
sebagai nama variabel saat perulangan di atasdict
sangat umum jika badan perulangan hanya beberapa baris. Untuk loop yang lebih rumit, sebaiknya gunakan nama yang lebih deskriptif:Sebaiknya biasakan menggunakan string format:
sumber
key
hanyalah sebuah variabel.Untuk Python2.X :
... atau lebih baik,
Untuk Python3.X :
sumber
Ketika Anda beralih melalui kamus menggunakan
for .. in ..
-syntax, itu selalu berulang di atas kunci (nilai-nilai dapat diakses menggunakandictionary[key]
).Untuk beralih dari pasangan nilai kunci, dalam Python 2 gunakan
for k,v in s.iteritems()
, dan dalam Python 3for k,v in s.items()
.sumber
items()
bukaniteritems()
Ini adalah idiom pengulangan yang sangat umum.
in
adalah seorang operator. Untuk kapan digunakanfor key in dict
dan kapan harusfor key in dict.keys()
melihat artikel Python Idiomatik David Goodger (salinan diarsipkan) .sumber
in
, bagian operator adalah tempat Anda memeriksa keberadaan . Mungkin lebih baik hapusin is an operator
informasi ini .Ini bukan hanya
for
loop. Kata penting di sini adalah "iterasi".Kamus adalah pemetaan kunci nilai:
Setiap kali kita beralih di atasnya, kita beralih di atas kunci. Nama variabel
key
hanya dimaksudkan untuk deskriptif - dan itu cukup tepat untuk tujuan tersebut.Ini terjadi dalam pemahaman daftar:
Ini terjadi ketika kami meneruskan kamus ke daftar (atau objek jenis koleksi lainnya):
Cara Python mengulangi adalah, dalam konteks di mana ia perlu, ia memanggil
__iter__
metode objek (dalam hal ini kamus) yang mengembalikan iterator (dalam hal ini, objek keyiterator):Kita tidak harus menggunakan metode khusus ini diri kita sendiri, sebagai gantinya, gunakan fungsi builtin masing-masing untuk menyebutnya,
iter
:Iterators memiliki
__next__
metode - tapi kami menyebutnya dengan fungsi builtin,next
:Ketika sebuah iterator habis, ia muncul
StopIteration
. Ini adalah cara Python tahu untuk keluar darifor
loop, atau daftar pemahaman, atau ekspresi generator, atau konteks berulang lainnya. Setelah iterator memunculkannya, iteratorStopIteration
akan selalu memunculkannya - jika Anda ingin mengulanginya lagi, Anda perlu yang baru.Kembali ke dikte
Kami telah melihat dikte yang berulang dalam banyak konteks. Apa yang telah kita lihat adalah bahwa setiap kali kita beralih pada dikt, kita mendapatkan kuncinya. Kembali ke contoh aslinya:
Jika kami mengubah nama variabel, kami masih mendapatkan kunci. Mari kita coba:
Jika kita ingin iterate atas nilai, kita perlu menggunakan
.values
metode dicts, atau keduanya bersama-sama,.items
:Dalam contoh yang diberikan, akan lebih efisien untuk beralih ke item-item seperti ini:
Tetapi untuk tujuan akademis, contoh pertanyaan itu baik-baik saja.
sumber
Saya memiliki use case di mana saya harus beralih melalui dict untuk mendapatkan pasangan kunci, nilai, juga indeks yang menunjukkan di mana saya berada. Beginilah cara saya melakukannya:
Perhatikan bahwa tanda kurung di sekitar kunci, nilainya penting, tanpa tanda kurung, Anda mendapatkan ValueError "nilai tidak cukup untuk dibuka".
sumber
Anda dapat memeriksa implementasi CPython
dicttype
di GitHub. Ini adalah tanda tangan dari metode yang mengimplementasikan diktator iterator:CPython dictobject.c
sumber
Untuk beralih lebih dari kunci, lebih lambat tetapi lebih baik digunakan
my_dict.keys()
. Jika Anda mencoba melakukan sesuatu seperti ini:itu akan membuat kesalahan runtime karena Anda mengubah kunci saat program sedang berjalan. Jika Anda benar-benar ingin mengurangi waktu, gunakan
for key in my_dict
caranya, tetapi Anda telah diperingatkan;).sumber
Ini akan mencetak output dalam urutan Diurutkan berdasarkan Nilai dalam urutan menaik.
Keluaran:
sumber