L'ordine delle chiavi nei dizionari


101

Codice:

d = {'a': 0, 'b': 1, 'c': 2}
l = d.keys()

print l

Questo stampa ['a', 'c', 'b']. Non sono sicuro di come il metodo keys()determini l'ordine delle parole chiave all'interno di l . Tuttavia, mi piacerebbe poter recuperare le parole chiave nell'ordine "corretto". L'ordine corretto ovviamente creerebbe l'elenco ['a', 'b', 'c'].


3
Se i dizionari Python sono come la maggior parte, in realtà sono tabelle hash. Tra le altre cose, ciò significa che l'ordine delle chiavi non è garantito o nemmeno specificato. In particolare, non ricorderebbe l'ordine in cui vengono aggiunte le chiavi.
cHao

3
@cHao: Questo essenzialmente significa che il tuo programma sarà indeterministico se ripeti gli elementi in un dizionario?
Ciao arrivederci

4
@ HelloGoodbye: non andrei così lontano; c'è ancora un comportamento molto prevedibile lì. Ogni iterazione completa vede esattamente una di ciascuna coppia chiave / valore. E nella maggior parte delle lingue, le vedrai persino nello stesso ordine ogni volta. A meno che i documenti non garantiscano un ordine particolare, non dovresti contare sul fatto che sia l'ordine che desideri. (Alcuni linguaggi (come Perl) in realtà randomizzeranno un po 'l'ordine - presumibilmente per motivi di sicurezza, ma penso che sia davvero solo per liberarti dall'abitudine di fare affidamento su un comportamento non specificato. :) Non penso che Python sia abbastanza quel male, ma eh ...)
cHao

1
L'ordine sarà lo stesso a condizione che il dict non sia stato modificato. Dal manuale: "Se items (), keys (), values ​​(), iteritems (), iterkeys () e itervalues ​​() vengono chiamati senza alcuna modifica al dizionario, gli elenchi corrisponderanno direttamente. Ciò consente la creazione di (valore, chiave) coppie utilizzando zip (): pair = zip (d.values ​​(), d.keys ()). "
steveayre

2
@sfranky Penso che ciò che steveayre intendesse è che l'ordine è lo stesso tra ciò che si ottiene utilizzando i diversi metodi menzionati, non lo stesso dell'ordinatore in cui sono stati scritti gli elementi.
bli

Risposte:


78

Puoi usare OrderedDict (richiede Python 2.7) o versioni successive.

Inoltre, nota che OrderedDict({'a': 1, 'b':2, 'c':3})non funzionerà poiché la dictcreazione con {...}ha già dimenticato l'ordine degli elementi. Invece, vuoi usare OrderedDict([('a', 1), ('b', 2), ('c', 3)]).

Come accennato nella documentazione, per le versioni inferiori a Python 2.7, puoi usare questa ricetta.


18
Tieni presente che l'ordine di un OrderedDict è l' ordine di inserzione ; le chiavi usciranno solo in ordine alfabetico se le hai inserite in questo modo.
Hugh Bothwell

è quello che ha mostrato come esempio semplificato; può o non può avere alcuna relazione con il modo in cui intende effettivamente usarlo. In precedenza ho incontrato persone che si aspettavano che OrderedDict restituisse inserimenti arbitrari in ordine ordinato, quindi ho sentito di doverlo segnalare.
Hugh Bothwell

119

Python 3.7+

In Python 3.7.0 la natura di conservazione dell'ordine di inserzione degli dictoggetti è stata dichiarata parte ufficiale delle specifiche del linguaggio Python. Pertanto, puoi fare affidamento su di esso.

Python 3.6 (CPython)

A partire da Python 3.6, per l'implementazione CPython di Python, i dizionari mantengono l'ordine di inserimento per impostazione predefinita. Tuttavia, questo è considerato un dettaglio di implementazione; dovresti comunque usare collections.OrderedDictse vuoi che l'ordine di inserzione sia garantito in altre implementazioni di Python.

Python> = 2.7 e <3.6

Usa la collections.OrderedDictclasse quando hai bisogno di una dictche ricordi l'ordine degli elementi inseriti.


48
>>> print sorted(d.keys())
['a', 'b', 'c']

Usa la funzione ordinata , che ordina l'iterabile passato.

Il .keys()metodo restituisce le chiavi in ​​un ordine arbitrario.


12
Questo non funziona se vuoi l'ordine originale e non è stato ordinato.
Simon

12

Basta ordinare l'elenco quando si desidera utilizzarlo.

l = sorted(d.keys())

12

Da http://docs.python.org/tutorial/datastructures.html :

"Il metodo keys () di un oggetto dizionario restituisce un elenco di tutte le chiavi usate nel dizionario, in ordine arbitrario (se lo vuoi ordinato, applica semplicemente la funzione Sort ())."


1

Sebbene l'ordine non abbia importanza in quanto il dizionario è hashmap. Dipende dall'ordine in cui viene inserito:

s = 'abbc'
a = 'cbab'

def load_dict(s):
    dict_tmp = {}
    for ch in s:
        if ch in dict_tmp.keys():
            dict_tmp[ch]+=1
        else:
            dict_tmp[ch] = 1
    return dict_tmp

dict_a = load_dict(a)
dict_s = load_dict(s)
print('for string %s, the keys are %s'%(s, dict_s.keys()))
print('for string %s, the keys are %s'%(a, dict_a.keys()))

output:
per la stringa abbc, le chiavi sono dict_keys (['a', 'b', 'c'])
per la stringa cbab, le chiavi sono dict_keys (['c', 'b', 'a'])


1
I dizionari in python sono ordinati solo dalla versione 3.6+ controlla questo
Crivella
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.