2014-11-13 8 views
5

Tutti gli esempi che ho trovato (in the documentation, ecc.) Definiscono OrderedDicts passando i dati al costruttore. Dalla documentazione:È possibile inizializzare un OrderedDict vuoto in Python con un meccanismo di ordinamento predefinito?

# regular unsorted dictionary 
d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2} 

# dictionary sorted by key 
OrderedDict(sorted(d.items(), key=lambda t: t[0])) 
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]) 

D'altro canto, è possibile inizializzare un OrderedDict fornendo parametri al costruttore, che la porta a preservare l'ordine in cui chiave, vengono aggiunti coppie di valori.

Sto cercando un tipo di costrutto che assomiglia a quanto segue, tranne senza "d.items()". In sostanza, sto chiedendo di ricordare un meccanismo senza fornirgli un esempio, che potrebbe sembrare folle. È la mia unica opzione per "hackerare" questo fornendo una "d" iniziale (sotto) con un singolo oggetto, o c'è un modo migliore?

OrderedDict(sorted(d.items(), key=lambda t: t[0])) 

Grazie!

+0

Sì, questo è il comportamento predefinito? –

+2

I dizionari ordinati non riordinano il contenuto al momento dell'inserimento. Ricordano l'ordine di inserzione e possono essere ordinati, ma non si limitano a ordinare automaticamente quando si aggiungono le chiavi. Per questo stai cercando qualcosa come SortedCollection. IIRC c'è una ricetta per uno (http://code.activestate.com/recipes/577197-sortedcollection/) che usa il modulo bisect, ma OrderedDict non è abbastanza da solo. –

+1

Potrebbe essere possibile eseguire il rollover, magari considerare l'utilizzo di un ['heapq'] (https://docs.python.org/2/library/heapq.html#module-heapq) per preservare l'ordine internamente – GP89

risposta

1

OrderedDict ha solo un algoritmo di ordinamento: ordine di inserimento. Qualunque ordine gli articoli vengono aggiunti allo OrderedDict è l'ordine che ha lo OrderedDict.

Se si desidera un altro metodo, è possibile scrivere la sottoclasse dict o solo una funzione di ordinamento che è possibile applicare quando l'ordine è effettivamente importante.