Pertanyaan Iterasi kamus menggunakan loop 'for'


Saya sedikit bingung dengan kode berikut:

d = {'x': 1, 'y': 2, 'z': 3} 
for key in d:
    print key, 'corresponds to', d[key]

Apa yang saya tidak mengerti adalah key bagian. Bagaimana Python mengenali bahwa ia hanya perlu membaca kunci dari kamus? Aku s key kata khusus dengan Python? Atau apakah itu hanya variabel?


2105
2017-07-20 22:27


asal


Jawaban:


key hanya nama variabel.

for key in d:

hanya akan menggulirkan tombol di kamus, daripada kunci dan nilai. Untuk menggulirkan kunci dan nilai, Anda dapat menggunakan yang berikut:

Untuk Python 2.x:

for key, value in d.iteritems():

Untuk Python 3.x:

for key, value in d.items():

Untuk menguji sendiri, ubah kata key untuk poop.

Untuk Python 3.x, iteritems() telah diganti dengan sederhana items(), yang mengembalikan tampilan set-seperti yang didukung oleh dikt, seperti iteritems() tetapi bahkan lebih baik. Ini juga tersedia dalam 2,7 sebagai viewitems().

Operasi items() akan berfungsi untuk 2 dan 3, tetapi dalam 2 itu akan mengembalikan daftar kamus (key, value) pasangan, yang tidak akan mencerminkan perubahan pada dikt yang terjadi setelah items() panggilan. Jika Anda ingin perilaku 2.x di 3.x, Anda bisa menelepon list(d.items()).


3784
2017-07-20 22:29



Bukan kunci itu adalah kata khusus, tetapi kamus itu mengimplementasikan protokol iterator. Anda dapat melakukan ini di kelas Anda, mis. Lihat pertanyaan ini untuk cara membangun iterator kelas.

Dalam kasus kamus, itu diimplementasikan pada tingkat C. Detailnya tersedia di PEP 234. Secara khusus, bagian berjudul "Iterators Kamus":

  • Kamus mengimplementasikan slot tp_iter yang mengembalikan efisien   iterator yang mengulang-ulang kunci kamus. [...] Ini   artinya kita bisa menulis

    for k in dict: ...
    

    yang setara dengan, tetapi jauh lebih cepat daripada

    for k in dict.keys(): ...
    

    selama pembatasan modifikasi pada kamus   (baik oleh loop atau dengan thread lain) tidak dilanggar.

  • Tambahkan metode ke kamus yang mengembalikan berbagai jenis   iterator secara eksplisit:

    for key in dict.iterkeys(): ...
    
    for value in dict.itervalues(): ...
    
    for key, value in dict.iteritems(): ...
    

    Ini artinya itu for x in dict adalah singkatan untuk for x in dict.iterkeys().


325
2017-07-20 23:52



Iterasi lebih dari satu dict iterates melalui kunci-kuncinya tanpa urutan tertentu, seperti yang Anda lihat di sini:

Edit: (Ini tidak lagi dalam kasus Python3.6, tetapi perhatikan bahwa itu tidak dijamin perilaku belum)

>>> d = {'x': 1, 'y': 2, 'z': 3} 
>>> list(d)
['y', 'x', 'z']
>>> d.keys()
['y', 'x', 'z']

Untuk contoh Anda, itu adalah ide yang lebih baik untuk digunakan dict.items():

>>> d.items()
[('y', 2), ('x', 1), ('z', 3)]

Ini memberi Anda daftar tupel. Saat Anda menggulirnya seperti ini, setiap tuple akan dibuka k dan v secara otomatis:

for k,v in d.items():
    print(k, 'corresponds to', v)

Menggunakan k dan v sebagai nama variabel ketika mengulang lebih dari satu dict cukup umum jika tubuh loop hanya beberapa baris. Untuk loop yang lebih rumit, sebaiknya gunakan nama yang lebih deskriptif:

for letter, number in d.items():
    print(letter, 'corresponds to', number)

Merupakan ide bagus untuk terbiasa menggunakan string format:

for letter, number in d.items():
    print('{0} corresponds to {1}'.format(letter, number))

151
2017-07-21 01:27



key hanyalah sebuah variabel.

Untuk Python2.X:

d = {'x': 1, 'y': 2, 'z': 3} 
for my_var in d:
    print my_var, 'corresponds to', d[my_var]

... atau lebih baik,

d = {'x': 1, 'y': 2, 'z': 3} 
for the_key, the_value in d.iteritems():
    print the_key, 'corresponds to', the_value

Untuk Python3.X:

d = {'x': 1, 'y': 2, 'z': 3} 
for the_key, the_value in d.items():
    print(the_key, 'corresponds to', the_value)

42
2017-07-20 23:49



Ketika Anda melakukan iterasi melalui kamus menggunakan for .. in ..-syntax, itu selalu iterates atas kunci (nilai-nilai dapat diakses menggunakan dictionary[key]).

Untuk beralih di atas pasangan nilai kunci, gunakan for k,v in s.iteritems().


39
2017-07-20 22:29



Ini adalah idiom perulangan yang sangat umum. in adalah operator. Untuk kapan harus digunakan for key in dict dan kapan harus for key in dict.keys() Lihat Artikel Idiomatic Python David Goodger.


20
2017-07-20 22:42



Anda dapat menggunakan ini:

for key,val in d.items():
    print key, 'is the key for ', val

9
2018-01-14 14:42



Saya memiliki use case di mana saya harus mengulang melalui dict untuk mendapatkan kunci, pasangan nilai, juga indeks yang menunjukkan keberadaan saya. Ini adalah bagaimana saya melakukannya:

d = {'x': 1, 'y': 2, 'z': 3} 
for i, (key, value) in enumerate(d.items()):
   print(i, key, value)

Perhatikan bahwa tanda kurung di sekitar kunci, nilai penting, tanpa tanda kurung, Anda mendapatkan ValueError "tidak cukup nilai untuk dibongkar".


6
2018-05-25 13:42



Iterasi kamus menggunakan loop 'for'

d = {'x': 1, 'y': 2, 'z': 3} 
for key in d:
    ...

Bagaimana Python mengenali bahwa ia hanya perlu membaca kunci dari   kamus? Apakah kunci kata khusus dengan Python? Atau apakah itu hanya sebuah   variabel?

Bukan hanya itu for loop. Kata yang penting di sini adalah "iterasi".

Kamus adalah pemetaan kunci untuk nilai:

d = {'x': 1, 'y': 2, 'z': 3} 

Setiap kali kami mengulanginya, kami mengulangi tombol. Nama variabel key hanya dimaksudkan untuk menjadi deskriptif - dan itu cukup tepat untuk tujuan tersebut.

Ini terjadi dalam pemahaman daftar:

>>> [k for k in d]
['x', 'y', 'z']

Ini terjadi ketika kita melewati kamus ke daftar (atau objek jenis koleksi lainnya):

>>> list(d)
['x', 'y', 'z']

Cara mengulangi Python adalah, dalam konteks di mana ia perlu, itu memanggil __iter__ metode objek (dalam hal ini kamus) yang mengembalikan iterator (dalam hal ini, objek keyiterator):

>>> d.__iter__()
<dict_keyiterator object at 0x7fb1747bee08>

Kita sebaiknya tidak menggunakan metode khusus ini, sebagai gantinya, gunakan fungsi bawaan masing-masing untuk menyebutnya, iter:

>>> key_iterator = iter(d)
>>> key_iterator
<dict_keyiterator object at 0x7fb172fa9188>

Iterator memiliki __next__ metode - tetapi kami menyebutnya dengan fungsi builtin, next:

>>> next(key_iterator)
'x'
>>> next(key_iterator)
'y'
>>> next(key_iterator)
'z'
>>> next(key_iterator)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

Ketika iterator habis, itu memunculkan StopIteration. Ini adalah bagaimana Python tahu untuk keluar for loop, atau pemahaman daftar, atau ekspresi generator, atau konteks iteratif lainnya. Setelah iterator naik StopIteration itu akan selalu menaikkannya - jika Anda ingin mengulang lagi, Anda memerlukan yang baru.

>>> list(key_iterator)
[]
>>> new_key_iterator = iter(d)
>>> list(new_key_iterator)
['x', 'y', 'z']

Kembali ke dicts

Kami telah melihat pengulangan di banyak konteks. Apa yang telah kita lihat adalah bahwa setiap kali kita mengulanginya, kita mendapatkan kunci. Kembali ke contoh asli:

d = {'x': 1, 'y': 2, 'z': 3} 
for key in d:

Jika kita mengubah nama variabel, kita masih mendapatkan kunci. Mari coba:

>>> for each_key in d:
...     print(each_key, '=>', d[each_key])
... 
x => 1
y => 2
z => 3

Jika kita ingin mengulang nilai, kita perlu menggunakan .values metode dicts, atau untuk keduanya bersama-sama, .items:

>>> list(d.values())
[1, 2, 3]
>>> list(d.items())
[('x', 1), ('y', 2), ('z', 3)]

Dalam contoh yang diberikan, akan lebih efisien untuk mengulangi item seperti ini:

for a_key, corresponding_value in d.items():
    print(a_key, corresponding_value)

Tetapi untuk tujuan akademis, contoh pertanyaan itu baik-baik saja.


4
2018-06-21 02:51