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.


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 .


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.


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



6

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

k, v = zip(*d.iteritems())

1
Dalam python3.x, gunakan dict.items ()
Good Will


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

-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]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.