2016-01-29 14 views
5

Mam listęSortowanie listy słownika pod warunkiem zamówienia

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

oraz listę słowników

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

Chcę uporządkować ten list_of_dct według kolejności podanej w wykazie, tj order wyjście powinno być następujące:

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

Wiem, jak sortować według podanej key, ale nie wtedy, gdy zamówienie zostało już wydane. Jak mogę to posortować?

PS: Mam już rozwiązanie O (n^2). Szukasz lepszego rozwiązania.

+1

po próbach ur .. –

+0

Czy kluczowa wartość "wartość" jest statyczna dla wszystkich dyktujących na liście, czy jest to tylko symbol zastępczy? Czy lista 'order' zawiera również wszystkie elementy obecne w dykcie, np. Duplikaty? –

+1

Zamiast wykonywania ogólnego sortowania, bardziej wydajne byłoby zbudowanie 'dyktatu' zawierającego wartości jako klucze, a następnie wyodrębnienie wpisów w kolejności od tego. Pytania: (1) Czy każda wartość w 'porządku' jest znana jako wartość w' list_of_dct'? (2) Czy ta sama wartość może wystąpić więcej niż raz w 'list_of_dct'? –

Odpowiedz

5

Zastosowanie indeksu listy order do sortowania Wystarczy spróbować, jeśli każdy słownik ma jedną wartość i chcesz sortując tym value-

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

Ale jeśli masz wiele wartości dla jednego klucza następnie zmienić indeks (tj. [0]), na którym będziesz sortować.

3

Zrób mapowanie 8 do 0, 7 do 1, ..., 11 do 5 przy użyciu 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} 

i używać go jako klucz sortowania:

>>> 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}] 

użytku sort_keys.get(..) zamiast sort_keys[..], aby zapobiec KeyError w przypadku podania wartości w order.

+2

Wycofano to ze względu na wyszukiwanie w trybie dict, które zawiera tylko 0 (1) złożoności. – The6thSense

Powiązane problemy