Python sözlüğü: anahtarlar () ve değerler () her zaman aynı sırada mıdır?


312

Görünüşe göre döndürülen listeler keys()ve values()sözlük yöntemleri her zaman 1'e 1 eşleşmedir (sözlüğün 2 yöntemi çağırmak arasında değişmediği varsayılarak).

Örneğin:

>>> 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

Arama keys()ve arama arasında sözlüğü değiştirmezseniz, values()yukarıdaki for-loop'un her zaman True yazdıracağını varsaymak yanlış mıdır? Bunu onaylayan herhangi bir belge bulamadım.


1
CPython 3.7'de (ve muhtemelen, muhtemelen), bir sözlük eşleme kampanya siparişinin yineleme sırasına güvenebilirsiniz. mail.python.org/pipermail/python-dev/2017-Aralık/151283.html
BallpointBen

@BallpointBen CPython 3.6 ve üstü ve Python 3.7
Boris

Yanıtlar:


353

Bunu buldum:

Eğer items(), keys(), values(), iteritems(), iterkeys(), ve itervalues()sözlüğe hiçbir müdahalede değişiklik ile adlandırılır, listeler doğrudan karşılık gelecektir.

Açık 2.x belgeleri ve 3.x belgeleri .


5
Görünüşe göre 3.x belgelerindeki ifade daha net: "öğelerin sırası doğrudan karşılık gelecektir"
Shaohua Li

4
Bu metin 3.7 dokümanında eksik. Bunun yalnızca 3.7'de
EliadL

80

Evet, gözlemlediğiniz şey garantili bir özelliktir - anahtarlar (), değerler () ve öğeler (), söz konusu değişiklik değiştirilmezse listeleri uyumlu bir sırayla döndürür. iterkeys () & c ayrıca karşılık gelen listelerle aynı sırada yinelenir.


1
Ancak, liste halinde olduğu değişmiş, Pandalar dataframeürün güncellenmiş veya silinebilir bir alternatif ve düzen ve bir öğe indeksi yerleri sunmaktadır dict benzeri yapının sabit kalır.
Ville

48

Evet , python 2.x'te garanti edilir :

Anahtarlarda, değerlerde ve öğe görünümlerinde sözlükte herhangi bir müdahale değişikliği yapılmadan yinelenirse, öğelerin sırası doğrudan karşılık gelir.



6

Dokümanlara iyi referanslar. Belgelere / uygulamaya bakılmaksızın siparişi nasıl garanti edebileceğiniz aşağıda açıklanmıştır:

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

1
Python3.x dosyasında dict.items () kullanın
Good Will


4

Değer için, yazdığım bazı ağır kullanılmış üretim kodu bu varsayımı temel alıyor ve onunla bir sorunum olmadı. Ama bunun doğru olmadığını biliyorum :-)

Eğer risk almak istemiyorsanız, eğer iteritems () kullanırdım.

for key, value in myDictionary.iteritems():
    print key, value

-2

Farklı cevaplar kullanırken bile dışa aktarılan değerlerin aynı sıraya sahip olmasını sağlamak istediğim için bu cevaplardan memnun kalmadım.

Burada anahtar sırasını önceden belirtirsiniz, dict değişse bile veya döndürülen değerler her zaman aynı sıraya sahip olur veya farklı bir dict kullanırsınız.

keys = dict1.keys()
ordered_keys1 = [dict1[cur_key] for cur_key in keys]
ordered_keys2 = [dict2[cur_key] for cur_key in keys]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.