620 votes

Trier une liste par plusieurs attributs ?

J'ai une liste de listes (qui auraient pu être des tuples, mais je m'égare) dans un format tel que :

[12, 'tall', 'blue', 1]
[15, 'tall', 'black', 3]
[13, 'tall', 'blue', 8]
[9, 'short', 'blue', 3]
[1, 'short', 'black', 2]
[2, 'short', 'red', 9]
[4, 'tall', 'blue', 13]

Si je voulais trier par un élément, disons l'élément grand/petit, je pourrais le faire via s = sorted(s, key = itemgetter(1))

Si je voulais trier par les DEUX critères (grand/petit et couleur), je pourrais effectuer le tri deux fois. Une fois pour chaque élément. Cependant, cela est ridicule du point de vue du calcul. Existe-t-il un moyen plus rapide ?

1064voto

Mark Byers Points 318575

Une clé peut être une fonction qui renvoie un tuple :

s = sorted(s, key = lambda x: (x[1], x[2]))

Ou vous pouvez réaliser la même chose en utilisant itemgetter :

import operator
s = sorted(s, key = operator.itemgetter(1, 2))

Et remarquez qu'ici vous pouvez utiliser sort au lieu d'utiliser sorted et ensuite réaffecter :

s.sort(key = operator.itemgetter(1, 2))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X