50 votes

Trier une liste de listes par ordre croissant puis décroissant

Si j'ai une liste qui contient une liste qui ressemble à ceci

['a',1] ['a',2] ['a',3] ['b',1] ['b',2] ['b',3]

Comment puis-je les trier de manière à ce que l'élément 0 soit trié de manière descendante et l'élément 1 de manière ascendante afin que le résultat soit le suivant

['b',1] ['b',2] ['b',3] ['a',1] ['a',2] ['a',3]

Utilisation de itemgetter Je peux passer en sens inverse sur l'élément 0 mais je recourt ensuite contre l'élément to bien sûr cela ruine le tri précédent. Je ne peux pas faire de clé combinée car il faut d'abord trier par ordre décroissant puis par ordre croissant.

63voto

Steven Rumbalski Points 16838
L = [['a',1], ['a',2], ['a',3], ['b',1], ['b',2], ['b',3]]
L.sort(key=lambda k: (k[0], -k[1]), reverse=True)

L contient maintenant :

[['b', 1], ['b', 2], ['b', 3], ['a', 1], ['a', 2], ['a', 3]]

45voto

mhyfritz Points 4123

Vous peut effectuent des tours successifs de tri comme le fait l'utilitaire de python sort est stable . Vous devez d'abord trier sur le clé secondaire bien que. Voir aussi le officiel COMMENT FAIRE .

from operator import itemgetter
l = [['a',2], ['a',1], ['b', 2], ['a',3], ['b',1], ['b',3]]
l.sort(key=itemgetter(1))
l.sort(key=itemgetter(0), reverse=True)
# [['b', 1], ['b', 2], ['b', 3], ['a', 1], ['a', 2], ['a', 3]]

3voto

Andreas Jung Points 1

Quelque chose comme

def mycmp(a, b):

  res = cmp(a[0], b[0])
  if res == 0:
     return cmp(a[1], b[1])
  return res

newlist = sorted(input_list, cmp=mycmp)

La méthode de comparaison vérifie d'abord le premier élément de chaque élément. S'ils sont égaux, elle vérifie le deuxième élément de chaque élément. La valeur de retour dans l'implémentation de mycmp() peut être niée afin d'implémenter un comportement de tri différent.

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