2009-12-09 6 views
17

Fellows:voci del dizionario Memorizzazione Python nell'ordine in cui sono spinti

dizionario

un pitone è memorizzato in ordine sparso (mappature non hanno alcun ordine), ad esempio,

>>> myDict = {'first':'uno','second':'dos','third':'tres'} 
myDict = {'first':'uno','second':'dos','third':'tres'} 
>>> myDict 
myDict 
{'second': 'dos', 'third': 'tres', 'first': 'uno'} 

Mentre è possibile recuperare una lista ordinata o tupla da un dizionario, mi chiedo se è possibile fare un dizionario memorizzare gli articoli nell'ordine in cui sono passati ad esso, nell'esempio precedente questo significherebbe avere l'ordinamento interno come {'first':'uno','second':'dos','third':'tres'} e non diverso.

Ho bisogno di questo perché sto usando il dizionario per memorizzare i valori mentre li leggo da un file di configurazione; una volta letti ed elaborati (i valori sono modificati), devono essere scritti in un nuovo file di configurazione nello stesso ordine in cui sono stati letti (questo ordine non è alfabetico né numerico).

Qualche idea?

Edit: Si prega di notare che io non sono alla ricerca di modi secondari per recuperare l'ordine (come le liste), ma di modi per rendere un dizionario essere ordinati in sé (come sarà nelle prossime versioni di Python) .

+2

http://stackoverflow.com/questions/1867861/python-dictionary-keep-keys-values-in-same-order-as-declared –

+0

@ Ofri Raviv: esattamente lo stesso problema. Grazie. – Escualo

+1

Dato che stai cercando di mantenere l'ordine, in realtà non è un dizionario. Stai facendo troppe cose. Potresti volere sia il dizionario (per la mappatura) che la lista (per mantenere l'ordine). Niente di male in questo. –

risposta

30

Prova pitone 2.7 e superiori, probabilmente 3.1, c'è OrderedDict

http://www.python.org/

http://python.org/download/releases/2.7/

>>> from collections import OrderedDict 
>>> d = OrderedDict([('first', 1), ('second', 2), 
...     ('third', 3)]) 
>>> d.items() 
[('first', 1), ('second', 2), ('third', 3)] 

PEP 372: Adding an ordered dictionary to collections

+0

Nice, ma tieni a mente che è una nuova funzionalità di una prossima release di Python e non è disponibile nelle versioni precedenti – akr

+0

... ma Sono bloccato con 2.5.1 :( – Escualo

+3

O ottenere il codice sorgente di OrderedDict da questa patch: http://bugs.python.org/issue5397 –

4

Utilizzare una lista per tenere l'ordine chiave

+0

rapido e sporco. ahimè, non molto compatto (può diventare fragile). –

+0

Questo funziona, ma sto cercando un modo più "naturale", se ce n'è uno. Sembra che OrderedDict suggerito da S.Mark sia l'alternativa che stavo cercando. Sfortunatamente sono bloccato con Python 2.5.1 :( – Escualo

+1

Non se incapsulare il dict e l'elenco in un singolo oggetto con l'interfaccia dict. Che, a proposito, è ciò che fanno molte implementazioni di Dict ordinati (non so sull'attuazione in realtà adottato in 2.7) –

1

Dizionari in Python sono implementati come tabelle hash, che è il motivo per cui l'ordine appare casuale. Potresti implementare la tua variante di un dict che ordina, ma perdi la comoda sintassi. Invece, tieni traccia dell'ordine dei tasti, anche.

inizializzazione:

keys = [] 
myDict = {} 

durante la lettura:

myDict[key] = value 
keys.append(key) 

durante la scrittura:

for key in keys: 
    print key, myDict[key] 
+0

Le mie chiavi non sono in ordine alfabetico o numerico :(Possono essere qualsiasi cosa – Escualo

+0

Non è necessario perdere alcuna sintassi. Implementare semplicemente metodi speciali come __get __() e __set __() ecc. uso di sintassi come dict ['key'] e dict ['key1'] = newvalue – Isaac

3

Implementazioni di dizionari di ordine-preservando certamente esistono.

C'è this one in Django, chiamato in modo confuso SortedDict, che funzionerà in Python> = 2.3 iirc.

+0

Appena notato questo sarà deprecato in Django 1.9. – imns

-2

C'è una breve risposta a questa .. fare questo--

dictCopy = yourdictname.copy()

quindi utilizzare il dictCopy, sarà nello stesso ordine.

+0

I dizionari in Python non hanno ordinamento, quindi la domanda. – Escualo

1

Piuttosto che spiegare la parte teorica darò un semplice esempio.

>>> from collections import OrderedDict 
>>> my_dictionary=OrderedDict() 
>>> my_dictionary['foo']=3 
>>> my_dictionar['aol']=1 
>>> my_dictionary 
OrderedDict([('foo', 3), ('aol', 1)])