201 votes

Tri d'une liste Python selon deux critères

J'ai la liste suivante créée à partir d'un CSV trié

 list1 = sorted(csv1, key=operator.itemgetter(1))
 

En fait, j'aimerais trier la liste en fonction de deux critères: d'abord par la valeur du champ 1, puis par la valeur du champ 2. Comment procéder?

381voto

jaap Points 504

Répondre à ce fil mort pour archive. Pas besoin d'importer quoi que ce soit lors de l'utilisation des fonctions lambda. La liste suivante "trie" par le premier élément, puis par le deuxième élément.

sorted(list, key = lambda x : (x[0], -x[1]))

175voto

mouad Points 21520

comme ça:

 list1 = sorted(csv1, key=operator.itemgetter(1, 2))
 

25voto

Duncan Points 25356

Python a un tri stable, donc à condition que la performance n'est pas un problème, le plus simple est de faire le tri par le champ 2 et ensuite de les trier à nouveau par le champ 1.

Cela vous donnera le résultat que vous voulez, le seul hic, c'est que si c'est une grande liste (ou que vous voulez trier souvent) l'appel de trier par deux fois peut-être inacceptable pour les frais généraux.

list1 = sorted(csv1, key=operator.itemgetter(2))
list1 = sorted(list1, key=operator.itemgetter(1))

Cette façon de faire permet également de gérer la situation où vous souhaitez que certaines colonnes inverse triés, il suffit d'inclure le "reverse=True' paramètre si nécessaire.

Sinon, vous pouvez passer plusieurs paramètres à itemgetter ou créer manuellement un n-uplet. Qui va probablement être plus rapide, mais le problème est qu'il n'a pas généraliser bien si certaines colonnes voulez être inversée triés (colonnes numériques peuvent encore être inversée, en niant, mais qui s'arrête le tri étant stable).

Donc, si vous n'avez pas besoin de toutes les colonnes inverse triés, partir pour de multiples arguments pour itemgetter, si vous pouvez, et les colonnes ne sont pas numériques ou vous veulent garder le tri stable de partir pour de multiples consécutifs sortes.

16voto

dappawit Points 3782
def keyfunc(x):
    return tuple(x[1],x[2])

list1 = sorted(csv1, key=keyfunc)

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