125 votes

Tri de la liste Python en fonction de la longueur de la chaîne

Je veux trier une liste de chaînes en fonction de la longueur de la chaîne. J'ai essayé d'utiliser le tri comme suit, mais cela ne semble pas me donner un résultat correct.

 xs = ['dddd','a','bb','ccc']
print xs
xs.sort(lambda x,y: len(x) < len(y))
print xs

['dddd', 'a', 'bb', 'ccc']
['dddd', 'a', 'bb', 'ccc']
 

Quel est le problème?

225voto

Eli Courtwright Points 53071

Lorsque vous passez une lambda de sort, vous avez besoin de retourner un entier, pas un booléen. Ainsi, votre code devrait plutôt lire

xs.sort(lambda x,y: cmp(len(x), len(y))

Notez que le cpm est un builtin fonction telle que cmp(x, y) retourne -1 si x est inférieure à y, 0 x est égal à y, et 1 cas x est plus grand que y.

Bien sûr, vous pouvez à la place utiliser l' key paramètre:

xs.sort(key = lambda s: len(s))

Ceci dit l' sort méthode de commande basé sur ce que la touche de fonction retourne.

EDIT: Merci à bl'alpha et Ruslan ci-dessous pour préciser que vous pouvez simplement transmettre len répertoire que le paramètre clé, éliminant ainsi la nécessité d'un lambda:

xs.sort(key = len)

Et comme Ruslan points ci-dessous, vous pouvez également utiliser le haut- triés en fonction plutôt que de l' list.sort méthode, qui crée une nouvelle liste plutôt que de tri de l'existant en place:

print sorted(xs, key=len)

95voto

Ruslan Spivak Points 692

Le même que dans la réponse d'Eli - en utilisant simplement un formulaire plus court, car vous pouvez sauter une partie lambda ici.

Créer une nouvelle liste:

 >>> xs = ['dddd','a','bb','ccc']
>>> sorted(xs, key=len)
['a', 'bb', 'ccc', 'dddd']
 

Tri sur place:

 >>> xs.sort(key=len)
>>> xs
['a', 'bb', 'ccc', 'dddd']
 

5voto

sjcipher Points 2626

Je Voudrais ajouter comment la pythonic touche de fonction alors que le tri :

Décorer-Tri-Undecorate Modèle De Conception :

Python est favorable à une touche de fonction lorsque le tri est mis en œuvre en utilisant ce qui est connu comme la décorer-tri-undecorate modèle de conception.

Il procède en 3 étapes:

  1. Chaque élément de la liste est temporairement remplacé par un "décoré" version qui inclut le résultat de la touche de fonction appliquée à l'élément.

  2. La liste est triée en fonction sur l'ordre naturel des clés.

  3. Les éléments décorés sont remplacés par les éléments d'origine.

Touche de paramètre pour spécifier une fonction qui doit être appelée sur chaque élément de la liste avant de faire des comparaisons. docs

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