Kamus Python: apakah kunci () dan nilai () selalu urutan yang sama?

312

Sepertinya daftar yang dikembalikan oleh keys()dan values()metode kamus selalu berupa pemetaan 1-ke-1 (dengan asumsi kamus tidak diubah antara memanggil 2 metode).

Sebagai contoh:

>>> d = {'one':1, 'two': 2, 'three': 3}
>>> k, v = d.keys(), d.values()
>>> for i in range(len(k)):
    print d[k[i]] == v[i]

True
True
True

Jika Anda tidak mengubah kamus antara menelepon keys() dan menelepon values(), apakah salah mengasumsikan bahwa for-loop di atas akan selalu dicetak Benar? Saya tidak dapat menemukan dokumentasi yang mengkonfirmasi hal ini.

Jason Coon
sumber
1
Dalam CPython 3.7 (dan lebih tinggi, mungkin) Anda dapat mengandalkan urutan iterasi dari urutan penyisipan kamus yang cocok. mail.python.org/pipermail/python-dev/2017-December/151283.html
BallpointBen
@BallpointBen ada di CPython 3.6 dan lebih tinggi dan semua implementasi Python lainnya dimulai dengan Python 3.7
Boris

Jawaban:

353

Menemukan ini:

Jika items(), keys(), values(), iteritems(), iterkeys(), dan itervalues()disebut tanpa modifikasi intervensi ke dalam kamus, daftar akan langsung sesuai.

Pada 2.x dokumentasi dan 3.x dokumentasi .

nosklo
sumber
5
rupanya pernyataan dalam dokumentasi 3.x lebih jelas: "urutan barang akan langsung sesuai"
Shaohua Li
4
Teks ini tidak ada dalam dokumentasi 3.7. Saya hanya dapat berasumsi itu karena "Dict menjaga urutan penyisipan" di 3.7: mail.python.org/pipermail/python-dev/2017-December/151283.html
EliadL
80

Ya, apa yang Anda amati sesungguhnya adalah properti yang dijamin - kunci (), nilai () dan item () daftar kembali dalam urutan kongruen jika dikt tersebut tidak diubah. iterkeys () & c juga beralih dalam urutan yang sama dengan daftar yang sesuai.

Alex Martelli
sumber
1
Namun, dalam kasus daftar ini diubah, Panda dataframemenawarkan alternatif mana barang yang bisa diperbarui atau dihapus, dan ketertiban dan lokasi indeks item dalam dict-seperti struktur tetap tetap.
Ville
48

Ya dijamin dengan python 2.x :

Jika kunci, nilai, dan tampilan item diulang tanpa modifikasi kamus, urutan item akan secara langsung sesuai.

Bjorn
sumber
6

Referensi yang baik untuk dokumen. Inilah cara Anda dapat menjamin pesanan terlepas dari dokumentasi / implementasi:

k, v = zip(*d.iteritems())
Sassa NF
sumber
1
Dalam python3.x, gunakan dict.items ()
Good Will
4

Menurut http://docs.python.org/dev/py3k/library/stdtypes.html#dictionary-view-objects , metode kunci (), nilai () dan item () dan item () dari sebuah dict akan mengembalikan iterator yang sesuai dengan pesanannya. sesuai. Namun, saya tidak dapat menemukan referensi ke dokumentasi resmi untuk python 2.x untuk hal yang sama.

Sejauh yang saya tahu, jawabannya adalah ya, tetapi hanya dengan python 3.0+

sykora
sumber
4

Untuk apa nilainya, beberapa kode produksi berat yang saya tulis didasarkan pada asumsi ini dan saya tidak pernah punya masalah dengan itu. Saya tahu itu tidak membuatnya benar :-)

Jika Anda tidak ingin mengambil risiko, saya akan menggunakan iteritems () jika Anda bisa.

for key, value in myDictionary.iteritems():
    print key, value
Koen Bok
sumber
-2

Saya tidak puas dengan jawaban ini karena saya ingin memastikan nilai yang diekspor memiliki urutan yang sama bahkan ketika menggunakan dikte yang berbeda.

Di sini Anda menentukan urutan kunci dimuka, nilai yang dikembalikan akan selalu memiliki urutan yang sama bahkan jika dikt perubahan, atau Anda menggunakan dit berbeda.

keys = dict1.keys()
ordered_keys1 = [dict1[cur_key] for cur_key in keys]
ordered_keys2 = [dict2[cur_key] for cur_key in keys]
jlansey
sumber