2017-05-18 3 views
2

Ich möchte eine Liste mit einer benutzerdefinierten Reihenfolge mit nur die Reihenfolge einiger Elemente zu sortieren. Der Rest der Gegenstände sollte im Wesentlichen als "anders" betrachtet werden, wo die Reihenfolge keine Rolle spielt.Benutzerdefinierte Sortierung einer Liste mit der Reihenfolge einiger Artikel

Zum Beispiel habe ich die folgende Liste, wo ich versuchte, nur ein paar der Elemente zu sortieren. Der folgende Code schlägt mit einem KeyError fehl, da er weder Badminton noch Cricket finden kann.

myList = ['Football', 'Baseball', 'Basketball', 'Badminton', 'Cricket'] 

myOrder = {"Baseball" : 1, "Basketball" : 2, "Football" : 3} 

myList.sort(key=lambda val: myOrder[val]) 

Wie nehme ich Rechnung des Restes der Elemente in der Liste, ohne sich um ihre Bestellung zu kümmern?

+5

myList.sort (key = Lambda-val: myOrder.get (val, 0))? – user234461

Antwort

3

In Python 2 können Sie myOrder.get als Sortierschlüssel verwenden, da None (der Standard-Wert get Returns) ist immer kleiner als jede ganze Zahl:

>>> myList = ['Football', 'Baseball', 'Basketball', 'Badminton', 'Cricket'] 
>>> myOrder = {"Baseball" : 1, "Basketball" : 2, "Football" : 3} 
>>> myList.sort(key=myOrder.get) 
>>> myList 
['Badminton', 'Cricket', 'Baseball', 'Basketball', 'Football'] 

In Python 3 nicht NoneType bestellen und int, so müssen Sie den Anruf get in einer anderen Funktion wie user234461-Lösung aus den Kommentaren wickeln:

myList.sort(key=lambda val: myOrder.get(val, 0)) 

Danke! Ist es möglich, sie am Ende der neu sortierten Liste zu platzieren?

Sicherlich könnte man float('inf') als Standardwert für den Anruf zu get verwenden:

>>> myList = ['Football', 'Baseball', 'Basketball', 'Badminton', 'Cricket'] 
>>> myList.sort(key=lambda x: myOrder.get(x, float('inf'))) 
>>> myList 
['Baseball', 'Basketball', 'Football', 'Badminton', 'Cricket'] 

bearbeiten 2: Oder Sie könnten die Standardreihenfolge in Ihrem myOrder Wörterbuch backen durch einen defaultdict verwenden. Ich mag es.

>>> from collections import defaultdict 
>>> myList = ['Football', 'Baseball', 'Basketball', 'Badminton', 'Cricket'] 
>>> myOrder = defaultdict(lambda: float('inf')) 
>>> myOrder.update({"Baseball" : 1, "Basketball" : 2, "Football" : 3}) 
>>> myList.sort(key=myOrder.__getitem__) 
>>> myList 
['Baseball', 'Basketball', 'Football', 'Badminton', 'Cricket'] 
+0

Vielen Dank! Ist es möglich, sie am Ende der neu sortierten Liste zu platzieren? – ILostMySpoon

Verwandte Themen