Dizionario Python: chiavi () e valori () sono sempre nello stesso ordine?


312

Sembra che gli elenchi restituiti keys()e i values()metodi di un dizionario siano sempre una mappatura 1 a 1 (supponendo che il dizionario non sia alterato tra la chiamata dei 2 metodi).

Per esempio:

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

Se non si modifica il dizionario tra la chiamata keys()e la chiamata values(), è errato supporre che il for-loop sopra stamperà sempre True? Non sono riuscito a trovare alcuna documentazione a conferma di ciò.


1
In CPython 3.7 (e versioni successive, presumibilmente) puoi fare affidamento sull'ordine di iterazione di un ordine di inserimento corrispondente al dizionario. mail.python.org/pipermail/python-dev/2017-December/151283.html
BallpointBen

@BallpointBen è in CPython 3.6 e versioni successive e tutte le altre implementazioni di Python che iniziano con Python 3.7
Boris

Risposte:


353

Trovato questo:

Se items(), keys(), values(), iteritems(), iterkeys(), e itervalues()sono chiamati senza effettuare modifiche al dizionario, le liste saranno direttamente corrispondere.

Sulla documentazione 2.x e la documentazione 3.x .


5
apparentemente la dichiarazione nella documentazione 3.x è più chiara: "l'ordine degli articoli corrisponderà direttamente"
Shaohua Li

4
Questo testo è mancante nella documentazione 3.7. Posso solo supporre che sia perché "Dict mantiene l'ordine di inserimento" in 3.7: mail.python.org/pipermail/python-dev/2017-December/151283.html
EliadL

80

Sì, ciò che hai osservato è effettivamente una proprietà garantita - keys (), valori () e items () restituiscono gli elenchi in ordine congruente se il dict non viene modificato. iterkeys () & c anche iterano nello stesso ordine degli elenchi corrispondenti.


1
Tuttavia, nel caso in cui l'elenco venga modificato, Pandas dataframeoffre un'alternativa in cui gli articoli possono essere aggiornati o eliminati e l'ordine e le posizioni dell'indice degli articoli in una struttura simile a un dict rimangono fissi.
Ville

48

Sì, è garantita in Python 2.x :

Se le visualizzazioni di chiavi, valori e voci vengono ripetute senza modifiche al dizionario, l'ordine degli elementi corrisponderà direttamente.



6

Buoni riferimenti ai documenti. Ecco come è possibile garantire l'ordine indipendentemente dalla documentazione / implementazione:

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

1
In python3.x, usa dict.items ()
Good Will il


4

Per quello che vale, un codice di produzione usato pesantemente che ho scritto si basa su questo presupposto e non ho mai avuto problemi con esso. So che non lo rende vero però :-)

Se non vuoi correre il rischio, userei iteritems () se puoi.

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

-2

Non ero soddisfatto di queste risposte poiché volevo assicurarmi che i valori esportati avessero lo stesso ordine anche quando si utilizzavano dadi diversi.

Qui si specifica in anticipo l'ordine delle chiavi, i valori restituiti avranno sempre lo stesso ordine anche se il dict cambia o si utilizza un dict diverso.

keys = dict1.keys()
ordered_keys1 = [dict1[cur_key] for cur_key in keys]
ordered_keys2 = [dict2[cur_key] for cur_key in keys]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.