Tampilan kamus pada dasarnya adalah apa namanya: tampilan hanya seperti jendela pada kunci dan nilai (atau item) dari kamus. Berikut adalah kutipan dari dokumentasi resmi untuk Python 3:
>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
>>> keys = dishes.keys()
>>> values = dishes.values()
>>> # view objects are dynamic and reflect dict changes
>>> del dishes['eggs']
>>> keys # No eggs anymore!
dict_keys(['sausage', 'bacon', 'spam'])
>>> values # No eggs value (2) anymore!
dict_values([1, 1, 500])
(Penggunaan setara Python 2 dishes.viewkeys()
dan dishes.viewvalues()
.)
Contoh ini menunjukkan karakter dinamis dari tampilan : tampilan kunci bukan salinan kunci pada titik waktu tertentu, tetapi lebih merupakan jendela sederhana yang menunjukkan kepada Anda kunci; jika mereka diubah, maka apa yang Anda lihat melalui jendela juga berubah. Fitur ini dapat berguna dalam beberapa keadaan (misalnya, seseorang dapat bekerja dengan tampilan pada tombol di beberapa bagian program alih-alih menghitung ulang daftar kunci saat ini setiap kali diperlukan) —Catat bahwa jika kunci kamus dimodifikasi sementara iterating over the view, bagaimana iterator seharusnya berperilaku tidak didefinisikan dengan baik, yang dapat menyebabkan kesalahan .
Satu keuntungan adalah bahwa melihat , katakanlah, tombol hanya menggunakan sejumlah kecil dan memori tetap dan membutuhkan sejumlah kecil dan waktu prosesor tetap , karena tidak ada pembuatan daftar kunci (Python 2, di sisi lain, sering kali tidak perlu membuat daftar baru, seperti dikutip oleh Rajendran T, yang mengambil memori dan waktu dalam jumlah yang sebanding dengan panjang daftar). Untuk melanjutkan analogi jendela, jika Anda ingin melihat lanskap di balik dinding, Anda cukup membuat celah di dalamnya (Anda membangun sebuah jendela); menyalin kunci ke dalam daftar akan sama dengan mengecat salinan lanskap di dinding Anda — salinan membutuhkan waktu, ruang, dan tidak memperbarui sendiri.
Untuk meringkas, tampilan hanyalah ... tampilan (windows) pada kamus Anda, yang menunjukkan isi kamus bahkan setelah itu berubah. Mereka menawarkan fitur yang berbeda dari daftar: daftar kunci berisi salinan kunci kamus pada titik waktu tertentu, sementara tampilan dinamis dan lebih cepat diperoleh, karena tidak harus menyalin data apa pun ( kunci atau nilai) agar dapat dibuat.
Seperti yang Anda sebutkan
dict.items()
mengembalikan salinan daftar kamus (kunci, nilai) pasangan yang boros dandict.iteritems()
mengembalikan iterator atas pasangan (kunci, nilai) kamus.Sekarang ambil contoh berikut untuk melihat perbedaan antara interator dict dan tampilan dict
Sedangkan tampilan hanya menunjukkan apa yang ada dalam dikt. Tidak masalah jika itu berubah:
Tampilan hanyalah tampilan kamus sekarang. Setelah menghapus suatu entri
.items()
akan menjadi usang dan.iteritems()
akan membuat kesalahan.sumber
viewitems()
sebenarnya benar (items()
benar memberikan tampilan di Python 3 ).Hanya dari membaca dokumen saya mendapatkan kesan ini:
Jadi saya kira kata kunci penggunaannya adalah jika Anda menyimpan kamus dan berulang kali mengulangi kunci / item / nilai dengan modifikasi di antaranya. Anda bisa menggunakan tampilan saja dan mengubahnya
for k, v in mydict.iteritems():
menjadifor k, v in myview:
. Tetapi jika Anda hanya mengulangi kamus sekali saja, saya pikir versi iter masih lebih disukai.sumber
iteritems()
). Jadi apa gunanya pandangan ini? Kapan saya senang memilikinya?.values()
, tetapi itu melibatkan membuat salinan keseluruhan sebagai daftar, yang bisa mahal. Ada.itervalues()
tetapi Anda tidak dapat mengkonsumsinya lebih dari sekali, sehingga tidak akan berfungsi dengan setiap fungsi. Tampilan tidak memerlukan salinan mahal, tetapi mereka masih lebih berguna sebagai nilai yang berdiri sendiri daripada iterator. Tapi mereka masih tidak dimaksudkan untuk membantu dengan iterasi dan memodifikasi pada saat yang sama (di sana Anda benar-benar menginginkan salinan)Metode tampilan mengembalikan daftar (bukan salinan daftar, dibandingkan dengan
.keys()
,.items()
dan.values()
), sehingga lebih ringan, tetapi mencerminkan isi kamus saat ini.Dari Python 3.0 - metode dict mengembalikan tampilan - mengapa?
sumber
Tampilan memungkinkan Anda mengakses struktur data yang mendasari, tanpa menyalinnya. Selain dinamis daripada membuat daftar, salah satu kegunaannya yang paling berguna adalah
in
tes. Katakanlah Anda ingin memeriksa apakah suatu nilai ada dict atau tidak (baik itu kunci atau nilai).Opsi satu adalah membuat daftar kunci menggunakan
dict.keys()
, ini berfungsi tetapi jelas mengkonsumsi lebih banyak memori. Jika diktnya sangat besar? Itu akan sia-sia.Dengan
views
Anda dapat mengulangi struktur data yang sebenarnya, tanpa daftar perantara.Mari kita gunakan contoh. Saya memiliki dict dengan 1000 kunci string dan digit acak dan
k
merupakan kunci yang ingin saya cariSeperti yang Anda lihat,
view
objek iterasi memberikan dorongan besar untuk kinerja, mengurangi overhead memori pada saat yang sama. Anda harus menggunakannya ketika Anda perlu melakukanSet
operasi seperti.Catatan : Saya menggunakan Python 2.7
sumber
.keys()
mengembalikan tampilan secara default. Mungkin ingin memeriksa dua kalik
salah satu kunci kamuslarge_d
dimaksudkan untuk dilakukank in large_d
, dengan Python, yang mungkin pada dasarnya secepat menggunakan tampilan (dengan kata lain,k in large_d.keys()
bukan Pythonic dan harus dihindari— apa adanyak in large_d.viewkeys()
).k in large_d
sebenarnya jauh lebih cepat daripada yang sebenarnyak in large_d.viewkeys()
, sehingga mungkin harus dihindari, tetapi ini masuk akalk in large_d.viewvalues()
.