2017-05-18 2 views
2

Je veux trier une liste en utilisant un ordre personnalisé en ne connaissant que l'ordre de quelques articles. Le reste des éléments doit être considéré comme «Autre» dans l'essence où l'ordre n'a pas d'importance. Par exemple, j'ai la liste suivante où j'ai essayé de trier seulement quelques-uns des éléments. Le code ci-dessous échouera avec une KeyError car il ne peut pas trouver Badminton ou Cricket.Personnalisation du tri d'une liste connaissant l'ordre de quelques articles

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

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

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

Comment puis-je prendre en compte le reste des articles dans la liste sans me soucier de leur commande?

+5

myList.sort (clé = lambda val: myOrder.get (val, 0))? – user234461

Répondre

3

En Python 2, vous pouvez utiliser myOrder.get comme tri clé, car None (le rendement de la valeur par défaut get) est toujours moindre que tout entier:

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

En Python 3, vous ne pouvez pas commander NoneType et int, de sorte que vous devrez envelopper l'appel à get dans une autre fonction comme la solution de user234461 des commentaires:

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

Merci! Est-il possible de les placer vers la fin de la liste nouvellement triée?

Certainement, vous pouvez utiliser float('inf') comme la valeur par défaut de l'appel à get:

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

modifier 2: Ou vous pouvez cuire la commande par défaut dans votre myOrder dictionnaire en utilisant un defaultdict. J'aime ça.

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

Merci! Est-il possible de les placer vers la fin de la liste nouvellement triée? – ILostMySpoon