2009-06-18 16 views
6

Eventuali duplicati:
Python dictionary: are keys() and values() always the same order?Dict restituirà chiavi e valori nello stesso ordine?

Se ho un dictonary in pitone, sarà .keys e .values ​​restituire i corrispondenti elementi nello stesso ordine?

E.g.

foo = {'foobar' : 1, 'foobar2' : 4, 'kittty' : 34743} 

Per i tasti che ritorna:

>>> foo.keys() 
['foobar2', 'foobar', 'kittty'] 

Ora sarà foo.values ​​() restituiscono gli elementi sempre nello stesso ordine in cui le chiavi corrispondenti?

risposta

17

E 'difficile migliorare il Python documentation:

chiavi e valori sono elencati in un ordine arbitrario che è non casuale, varia a seconda delle implementazioni di Python, e dipende dalla storia del dizionario di inserimenti ed eliminazioni. Se items(), keys(), values(), , iterkeys() e itervalues() vengono chiamati senza modifiche intermedie al dizionario, le liste corrisponderanno direttamente. Ciò consente la creazione di coppie (value, key) utilizzando zip(): pairs = zip(d.values(), d.keys()). La stessa relazione vale per i metodi iterkeys() e itervalues(): pairs = zip(d.itervalues(), d.iterkeys()) fornisce lo stesso valore per le coppie. Un altro modo per creare la stessa lista è pairs = [(v, k) for (k, v) in d.iteritems()]

Così, in breve, "sì" con l'avvertenza che non è necessario modificare il dizionario tra la chiamata al keys() e la chiamata a values().

+0

Perfetto im idiota. Ho completamente perso il punto principale. :( – UberJumper

1

Sì, saranno

Basta vedere il doc a Python doc:

chiavi e valori sono elencati in un ordine arbitrario che è non casuale, varia a seconda delle implementazioni di Python, e dipende dal dizionario di cronologia degli inserimenti e delle eliminazioni. Se item(), keys(), values ​​(), iteritems(), iterkeys() e itervalues ​​() vengono chiamati senza modifiche intermedie al dizionario, gli elenchi corrisponderanno direttamente.

cosa migliore da fare è ancora necessario utilizzare dict.items()

1

Dalla documentazione Python 2.6:

chiavi e valori sono elencati in un ordine arbitrario che è non casuale, varia attraverso le implementazioni Python e dipende dalla cronologia degli inserimenti e delle cancellazioni del dizionario. Se items(), keys(), values(), , iterkeys() e itervalues() vengono chiamati senza modifiche intermedie al dizionario, le liste corrisponderanno direttamente. Ciò consente la creazione di coppie (valore, chiave) utilizzando zip(): pairs = zip(d.values(), d.keys()).La stessa relazione vale per i metodi iterkeys() e itervalues(): pairs = zip(d.itervalues(), d.iterkeys()) fornisce lo stesso valore per le coppie. Un altro modo per creare la stessa lista è pairs = [(v, k) for (k, v) in d.iteritems()].

Sono oltre il 99% certo che lo stesso vale per Python 3.0.

+0

Non c'è bisogno di speculare su Python 3.0 La documentazione è qui: http://docs.python.org/3.0/library/stdtypes.html#dictionary-view-objects and affermative. –

Problemi correlati