Apakah ada perbedaan yang berlaku antara dict.items()
dan dict.iteritems()
?
Dari dokumen Python :
dict.items()
: Kembalikan salinan daftar pasangan (kunci, nilai) kamus.
dict.iteritems()
: Kembalikan iterator melalui pasangan (kunci, nilai) kamus.
Jika saya menjalankan kode di bawah ini, masing-masing tampaknya mengembalikan referensi ke objek yang sama. Apakah ada perbedaan halus yang saya lewatkan?
#!/usr/bin/python
d={1:'one',2:'two',3:'three'}
print 'd.items():'
for k,v in d.items():
if d[k] is v: print '\tthey are the same object'
else: print '\tthey are different'
print 'd.iteritems():'
for k,v in d.iteritems():
if d[k] is v: print '\tthey are the same object'
else: print '\tthey are different'
Keluaran:
d.items():
they are the same object
they are the same object
they are the same object
d.iteritems():
they are the same object
they are the same object
they are the same object
python
dictionary
python-2.x
serigala
sumber
sumber
items()
membuat item sekaligus dan mengembalikan daftar.iteritems()
mengembalikan generator - generator adalah objek yang "menciptakan" satu item pada suatu waktu setiap kalinext()
dipanggil.d[k] is v
akan selalu mengembalikan True karena python menyimpan array objek integer untuk semua integer antara -5 dan 256: docs.python.org/2/c-api/int.html Ketika Anda membuat sebuah int dalam kisaran itu, Anda sebenarnya hanya mendapatkan kembali referensi ke objek yang ada:>> a = 2; b = 2 >> a is b True
Tapi,>> a = 1234567890; b = 1234567890 >> a is b False
iteritems()
perubahaniter()
pada Python 3? Tautan dokumentasi di atas sepertinya tidak cocok dengan jawaban ini.Jawaban:
Itu bagian dari evolusi.
Awalnya, Python
items()
membuat daftar tupel dan mengembalikannya. Itu berpotensi mengambil banyak memori ekstra.Kemudian, generator diperkenalkan ke bahasa secara umum, dan metode itu diterapkan kembali sebagai metode iterator-generator yang dinamai
iteritems()
. Dokumen asli tetap untuk kompatibilitas ke belakang.Salah satu perubahan Python 3 adalah
items()
sekarang mengembalikan iterator, dan daftar tidak pernah sepenuhnya dibangun. Theiteritems()
Metode juga hilang, karenaitems()
di Python 3 karya sepertiviewitems()
di Python 2.7.sumber
iteritems()
. Ini benar-benar membuat objek protokol urutan penuh yang juga mencerminkan perubahan pada dikt (dan didukung oleh dikt itu sendiri, bukan daftar yang berlebihan) - itu telah di-backport ke 2,7 sebagaiviewitems()
.iteritems()
selalu lebih disukai daripadaitems()
di Python 2.xdict.items()
mengembalikan daftar 2-tupel ([(key, value), (key, value), ...]
), sedangkandict.iteritems()
generator yang menghasilkan 2-tupel. Yang pertama membutuhkan lebih banyak ruang dan waktu pada awalnya, tetapi mengakses setiap elemen dengan cepat, sedangkan yang kedua membutuhkan lebih sedikit ruang dan waktu pada awalnya, tetapi sedikit lebih banyak waktu dalam menghasilkan setiap elemen.sumber
copy.deepcopy
). Ini berarti bahwa ini adalah salinan dari item kamus: jika Anda lakukanitems = dct.items()
dan kemudian memodifikasidct
dengan menambahkan / menghapus kunci ataudct[k] = other_v
,items
akan tetap sama.{1:'one', 2:'two', ... }
yang ingin saya ulangi di server web dan render hasilnya. Pada skala apa saya harus mulai khawatir tentang memilih.items()
vs.iteritems()
untuk Python 2.7?Di Py2.x
Perintah
dict.items()
,dict.keys()
dandict.values()
mengembalikan salinan dari kamus ini daftar dari(k, v)
pasangan, kunci dan nilai-nilai. Ini bisa memakan banyak memori jika daftar yang disalin sangat besar.Perintah
dict.iteritems()
,dict.iterkeys()
dandict.itervalues()
kembalikan iterator pada(k, v)
pasangan kamus , kunci dan nilai.Perintah
dict.viewitems()
,dict.viewkeys()
dandict.viewvalues()
mengembalikan objek tampilan , yang dapat mencerminkan perubahan kamus. (Yaitu jika Andadel
item atau menambahkan(k,v)
pasangan dalam kamus, objek tampilan dapat secara otomatis berubah pada saat yang sama.)Sementara di Py3.x
Di Py3.x, segalanya lebih bersih, karena hanya ada
dict.items()
,dict.keys()
dandict.values()
tersedia, yang mengembalikan objek tampilan sepertidict.viewitems()
pada Py2.x.Tapi
Seperti yang dicatat @lvc, objek tampilan tidak sama dengan iterator , jadi jika Anda ingin mengembalikan iterator di Py3.x, Anda bisa menggunakan
iter(dictview)
:sumber
Anda bertanya: 'Apakah ada perbedaan yang berlaku antara dict.items () dan dict.iteritems ()'
Ini dapat membantu (untuk Python 2.x):
Anda dapat melihat bahwa
d.items()
mengembalikan daftar tupel kunci, pasangan nilai dand.iteritems()
mengembalikan kamus-itemiterator.Sebagai daftar, d.items () dapat diiris:
Tetapi tidak akan memiliki
__iter__
metode:Sebagai iterator, d.iteritems () tidak dapat diiris:
Tetapi memang memiliki
__iter__
:Jadi barangnya sendiri sama - wadah yang mengantarkan barang berbeda. Satu adalah daftar, yang lain merupakan iterator (tergantung pada versi Python ...)
Jadi perbedaan yang berlaku antara dict.items () dan dict.iteritems () sama dengan perbedaan yang berlaku antara daftar dan iterator.
sumber
dict.items()
mengembalikan daftar tupel, dandict.iteritems()
mengembalikan objek itupator tupel dalam kamus sebagai(key,value)
. Tupelnya sama, tetapi wadahnya berbeda.dict.items()
pada dasarnya menyalin semua kamus ke dalam daftar. Coba gunakan kode berikut untuk membandingkan waktu eksekusidict.items()
dandict.iteritems()
. Anda akan melihat perbedaannya.Output di mesin saya:
Ini jelas menunjukkan bahwa
dictionary.iteritems()
jauh lebih efisien.sumber
Jika Anda memiliki
dict = {key1:value1, key2:value2, key3:value3,...}
Dalam Python 2 ,
dict.items()
menyalin setiap tupel dan mengembalikan daftar tupel dalam kamus yaitu[(key1,value1), (key2,value2), ...]
. Implikasinya adalah bahwa seluruh kamus disalin ke daftar baru yang berisi tupeldict.iteritems()
mengembalikan iterator item kamus. Nilai item yang dikembalikan juga sama yaitu(key1,value1), (key2,value2), ...
, tetapi ini bukan daftar. Ini hanya objek item iterator kamus. Itu berarti lebih sedikit penggunaan memori (50% lebih sedikit).d.items() -> list(d.items())
d.iteritems() -> iter(d.items())
Tupelnya sama. Anda membandingkan tupel di masing-masing sehingga Anda mendapatkan yang sama.
Dalam Python 3 ,
dict.items()
mengembalikan objek iterator. dict.iteritems () dihapus sehingga tidak ada masalah lagi.sumber
dict.iteritems
hilang di Python3.x Jadi gunakaniter(dict.items())
untuk mendapatkan output dan alokasi memori yang samasumber
Jika Anda ingin cara untuk mengulangi pasangan item kamus yang berfungsi dengan Python 2 dan 3, coba sesuatu seperti ini:
Gunakan seperti ini:
sumber
dict.iteritems()
: memberi Anda sebuah iterator. Anda dapat menggunakan iterator dalam pola lain di luar loop.sumber
dict.iteritems () di python 2 sama dengan dict.items () di python 3.
sumber