2013-03-31 6 views
46

Sto provando a creare un oggetto OrderedDict ma non appena lo creo, gli elementi sono tutti confusi.Python OrderedDict non mantiene l'ordine degli elementi

Questo è quello che faccio:

from collections import OrderedDict 
od = OrderedDict({(0,0):[2],(0,1):[1,9],(0,2):[1,5,9]}) 

Gli elementi non rimanere nell'ordine assegno

od 
OrderedDict([((0, 1), [1, 9]), ((0, 0), [2]), ((0, 2), [1, 5, 9])]) 

docs.python.org non ha un esempio e non posso' t capire perché l'ordine si sta confondendo. Qualsiasi aiuto è molto apprezzato.

risposta

85

Il tuo problema è che si sta costruendo un dict per dare i dati iniziali al OrderedDict - questo dictnon lo fa negozio di qualsiasi ordine, per cui l'ordine è perduto prima che arrivi al OrderedDict.

La soluzione è quella di costruire da un tipo di dati ordinata - il più facile essere un list di tuple s:

>>> from collections import OrderedDict 
>>> od = OrderedDict([((0, 0), [2]), ((0, 1), [1, 9]), ((0, 2), [1, 5, 9])]) 
>>> od 
OrderedDict([((0, 0), [2]), ((0, 1), [1, 9]), ((0, 2), [1, 5, 9])]) 

Vale la pena notare che questo è il motivo per cui OrderedDict usa la sintassi lo fa per la sua rappresentazione di stringa - stringa le rappresentazioni dovrebbero cercare di essere codice Python valido per riprodurre l'oggetto dove possibile, ed è per questo che l'output usa una lista di tuple invece di un dict.

+12

Inoltre, passare nomi/valori al costruttore non è sufficiente per impostare l'ordine. '>>> dall'importazione di serie OrderedDict' ' >>> OrderedDict (one = 1, two = 2, three = 3, four = 4) ' ' OrderedDict ([('four', 4), ('one ', 1), (' tre ', 3), (' due ', 2)]) ' –

+1

@EricSmith In effetti, per lo stesso motivo - variabili parole chiave args (' ** kwargs') in Python sono memorizzate come dizionario - così quando succede, l'ordine è perso come prima. Nota che [PEP-468] (http://legacy.python.org/dev/peps/pep-0468/) ha una soluzione semplice a questo: usa un 'OrderedDict' per' kwargs', non ancora una funzione, ma forse un giorno. –

+1

@GarethLatty ora in [python 3.6] (https://docs.python.org/3/whatsnew/3.6.html#pep-468-preserving-keyword-argument-order) hanno implementato PEP-468 – Copperfield