2016-01-29 7 views
5

ich eine Liste habeSortieren einer Liste von Wörterbuch zur Verfügung gestellt, um eine

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

und eine Liste der Wörterbücher

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

Ich möchte diese list_of_dct von der Reihenfolge, in order Liste gegeben sortieren, dh die Ausgabe sollte folgende sein:

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

Ich weiß, wie man nach einem gegebenen sortiert key, aber nicht, wenn eine Bestellung bereits erfolgt ist. Wie kann ich es sortieren?

PS: Ich habe bereits eine O (n^2) -Lösung. Auf der Suche nach einer besseren Lösung.

+1

post ur Versuche .. –

+0

Ist der Schlüssel 'value' statisch für alle dict in der Liste oder ist es nur ein Platzhalter? Enthält die "Bestell" -Liste auch alle im Diktat vorhandenen Artikel, d. H. Auch Duplikate? –

+1

Anstatt eine allgemeine Sortierung durchzuführen, wäre es effizienter, ein "dict" zu erstellen, das die Werte als Schlüssel enthält, und dann einfach die Einträge in der Reihenfolge daraus zu extrahieren. Fragen: (1) Ist jeder Wert in 'order' bekannt als ein Wert in' list_of_dct'? (2) Kann derselbe Wert mehr als einmal in 'list_of_dct' auftreten? –

Antwort

5

Verwenden Index der order Liste zu sortieren-Versuche mal, wenn jedes Wörterbuch einen Wert hat, und Sie wollen das Sortieren von diesem wert-

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

Aber wenn Sie mehrere Werte für einen Schlüssel haben dann den Index ändern (dh [0]), auf dem Sie sortieren werden.

3

Stellen eine Zuordnung von 8 bis 0, 7: 1, ..., 11-5 enumerate Verwendung:

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

und als Sortierschlüssel verwenden:

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

Verwendung sort_keys.get(..) anstelle von sort_keys[..] zu verhindern KeyError im Falle von Wert ist in order falsch.

+2

Upvoted es wegen der dict-Lookup, die nur 0 (1) Komplexität. – The6thSense

Verwandte Themen