2014-05-10 18 views
6

Supponiamo che io sono un oggetto collections.OrderedDict e un elenco riarrangiata dei suoi tasti:Come ordinare OrderedDict usando un elenco ordinato di chiavi?

ordereddict = collections.OrderedDict((
    ('key_78', 'value'), 
    ('key_40', 'value'), 
    ('key_96', 'value'), 
    ('key_53', 'value'), 
    ('key_04', 'value'), 
    ('key_89', 'value'), 
    ('key_52', 'value'), 
    ('key_86', 'value'), 
    ('key_16', 'value'), 
    ('key_63', 'value'), 
)) 

# Example only; actual list will **not** == sorted(ordereddict) 
key_list = ['key_04', 'key_16', 'key_40', 'key_52', 'key_53', 'key_63', 'key_78', 'key_86', 'key_89', 'key_96'] 

Come posso ordinare la OrderedDict in modo che sia ordinato nello stesso modo come il key_list?

+0

C'è qualche motivo per evitare di creare un nuovo ordine? Perché è facile ... – mgilson

+0

perché vuoi un elenco di chiavi per ordinare le chiavi, perché non ordinare solo le chiavi stesse? –

risposta

3

utilizzare il seguente:

def sort_by_list(dict_, list_): 
    for key in list_: 
     dict_.move_to_end(key) 

sort_by_list(ordereddict, key_list) 

Questo funziona solo se il list_ contiene tutte le chiavi del dizionario, e su Python 3.2 o successivo.

7

basta creare un nuovo OrderedDict:

newdct = OrderedDict((key, olddct[key]) for key in sortedlist) 

Se avete veramente bisogno che questo accada in luogo, è possibile cancellare il olddct e aggiornarlo con quella nuova:

olddct.clear() 
olddct.update(newdct) 
+0

Ho testato la performance (con 'timeit'), e il mio metodo era 2-4 volte più veloce. A parte questo, modificare il ditt sul posto è anche più adatto al suo uso nel mio programma. – minerz029

+0

@ minerz029 Il tuo metodo richiede Python 3, però. – user4815162342

+0

@ user4815162342: sto usando Python 3.3, ma aggiungerò una nota alla mia risposta. – minerz029

Problemi correlati