2016-01-29 22 views
5

Ho una listaordinare un elenco di dizionario fornito un ordine

order = [8, 7, 5, 9, 10, 11] 

e un elenco di dizionari

list_of_dct = [{'value':11}, {'value':8}, {'value':5}, {'value':7}, {'value':10}, {'value':9}] 

voglio risolvere la questione list_of_dct dall'ordine dato in order lista, vale a dire l'output dovrebbe essere il seguente:

list_of_dct = [{'value':8}, {'value':7}, {'value':5}, {'value':9}, {'value':10}, {'value':11}] 

So come ordinare per un dato key, ma non quando un ordine è già stato dato. Come posso ordinarlo?

PS: Ho già una soluzione O (n^2). Alla ricerca di una soluzione migliore.

+1

tentativi di posta elettronica .. –

+0

La chiave 'valore' statico per tutti i dict nell'elenco o è solo un segnaposto? Inoltre, la lista 'order' contiene tutti gli articoli presenti nella dict cioè i duplicati? –

+1

Anziché eseguire un ordinamento generale, sarebbe più efficiente creare un 'dict' contenente i valori come chiavi, quindi estrarre semplicemente le voci in ordine. Domande: (1) È noto che ogni valore in 'order' esiste come valore in 'list_of_dct'? (2) Può lo stesso valore verificarsi più volte in 'list_of_dct'? –

risposta

5

Usa indice della lista order per ordinare-Basta provare se ogni dizionario ha un valore e si desidera che l'ordinamento per valore-

sorted(list_of_dct,key=lambda x:order.index(x.values()[0])) 

Ma se si dispone di più valori per una chiave quindi modificare l'indice (ie [0]) su cui ordinerai.

3

fare una mappatura di 8-0, 7-1, ..., 11 a 5 utilizzando enumerate:

>>> order = [8,7,5,9,10,11] 
>>> list_of_dct = [{'value':11}, {'value':8}, {'value':5}, 
        {'value':7}, {'value':10}, {'value':9}] 
>>> sort_keys = {item: i for i, item in enumerate(order)} 
>>> sort_keys 
{5: 2, 7: 1, 8: 0, 9: 3, 10: 4, 11: 5} 

e usarlo come una chiave di ordinamento:

>>> list_of_dct.sort(key=lambda d: sort_keys.get(d['value'], len(sort_keys))) 
>>> list_of_dct 
[{'value': 8}, {'value': 7}, {'value': 5}, {'value': 9}, 
{'value': 10}, {'value': 11}] 

uso sort_keys.get(..) invece di sort_keys[..] per impedire KeyError in caso di valore errato in order.

+2

Lo ha svalutato a causa della ricerca dict che ha solo 0 (1) complessità. – The6thSense