2009-03-23 10 views
3

In Oracle SQL, um eine Funktion zu bestellen wie folgt ist:Python: beliebige Reihenfolge von

order by decode("carrot" = 2 
       ,"banana" = 1 
       ,"apple" = 3) 

Was wird der beste Weg, dies in Python zu implementieren?

Ich möchte in der Lage sein, ein Diktat auf seinen Schlüsseln zu bestellen. Und diese Reihenfolge ist nicht alphabetisch oder irgendetwas, ich bestimme die Reihenfolge.

+0

Wörterbücher sind nicht wirklich geordnet, was meinst du damit, ein Wörterbuch zu bestellen? –

Antwort

4

Sie können kein Diktat per se bestellen, aber Sie können es in eine Liste von (Schlüssel-, Wert-) Tupeln konvertieren, und Sie können das sortieren.

Verwenden Sie dazu die .items() -Methode. Zum Beispiel

>>> {'a': 1, 'b': 2} 
{'a': 1, 'b': 2} 
>>> {'a': 1, 'b': 2}.items() 
[('a', 1), ('b', 2)] 

Die effizienteste Art zu sortieren, ist die Verwendung einer Schlüsselfunktion. Die Verwendung von cmp ist weniger effizient, da es für jedes Paar von Elementen aufgerufen werden muss, wobei die Verwendung von Schlüssel nur einmal für jedes Element aufgerufen werden muss. Geben Sie einfach eine aufrufbare, den das Element verwandeln wird nach wie sollte es sortiert werden:

sorted(somedict.items(), key=lambda x: {'carrot': 2, 'banana': 1, 'apple':3}[x[0]]) 

Die oben definiert eine dict, die die benutzerdefinierte Reihenfolge des Schlüssels gibt an, die Sie wollen, und das Lambda gibt diesen Wert zurück für jede Taste im alten dict.

+0

cmp erzwingt keine Blasensortierung, aber es ist langsamer. – recursive

+1

"zwingt es eine Blasensortierung"? "Ja wirklich?" Ich finde das schwer zu glauben. –

1

Pythons Diktat ist ein hashmap, also hat es keine Reihenfolge. Sie können die Schlüssel jedoch separat sortieren und aus dem Wörterbuch mit der Methode keys() extrahieren.

sorted() nimmt Vergleich und Schlüsselfunktionen als Argumente.

Sie können mit exakte Kopie Ihrer dekodieren tun

sortedKeys = sorted(dictionary, {"carrot": 2 
           ,"banana": 1 
           ,"apple": 3}.get); 
+0

Wird nicht sortiert (Wörterbuch, Lambda usw.) genauso gut funktionieren? Ich glaube nicht, dass Sie die Schlüssel explizit extrahieren müssen, sortiert wird das für Sie tun? –

+0

Nein. Wie gesagt, Wörterbücher haben keine Reihenfolge. wörterbuch.schlüssel() ist liste, kann also bestellt werden. – vartec

+0

-1: Schöne Antwort bis zum Lambda. Dann nicht so nett. –

1

Sie nicht ein Wörterbuch sortieren; Ein Wörterbuch ist ein Mapping und ein Mapping hat keine Reihenfolge.

Sie könnten die Schlüssel extrahieren und solche sortieren, aber:

keys = myDict.keys() 
sorted_keys = sorted(keys, myCompare) 
0

A dict nicht bestellt wird. Sie müssen eine Liste der Schlüssel führen.

Sie können Ihre eigene Vergleichsfunktion an list.sort() oder sorted() übergeben.

Wenn Sie nach mehreren Schlüsseln sortieren müssen, verketten Sie sie einfach in einem Tupel und sortieren nach dem Tupel.

14

Verwenden Sie das key genannte Schlüsselwortargument sorted().

#set up the order you want the keys to appear here 
order = ["banana", "carrot", "apple"] 

# this uses the order list to sort the actual keys. 
sorted(keys, key=order.index) 

Für eine höhere Leistung als list.index, könnten Sie dict.get stattdessen verwenden.

#this builds a dictionary to lookup the desired ordering 
order = dict((key, idx) for idx, key in enumerate(["banana", "carrot", "apple"])) 

# this uses the order dict to sort the actual keys. 
sorted(keys, key=order.get) 
+0

+1: Mit dem 'cmp' Argument Anfang in Python 3.0 entfernt entfernt, und Vergleichsfunktionen sowieso schrecklich langsam, mit dem Schlüssel Argument wie folgt ist in der Tat der beste Weg, um fortzufahren –

+0

Das ist ziemlich elegant. Ich mag es. – SpoonMeiser

Verwandte Themen