Trier la liste Python en fonction de la longueur de la chaîne
110
Je souhaite 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.
Lorsque vous passez un lambdaà sort, vous devez renvoyer un entier et non un booléen. Donc, votre code devrait plutôt se lire comme suit:
xs.sort(lambda x,y: cmp(len(x), len(y)))
Notez que cmp est une fonction intégrée telle que cmp(x, y)renvoie -1 si xest inférieur à y, 0 si xest égal à yet 1 si xest supérieur à y.
Bien sûr, vous pouvez utiliser à la place le keyparamètre:
xs.sort(key=lambda s: len(s))
Cela indique à la sortméthode de commander en fonction de ce que la fonction clé renvoie.
EDIT: Merci à balpha et Ruslan ci-dessous pour avoir souligné que vous pouvez simplement passer lendirectement comme paramètre clé à la fonction, éliminant ainsi le besoin d'un lambda:
xs.sort(key=len)
Et comme Ruslan le souligne ci-dessous, vous pouvez également utiliser la fonction triée intégrée plutôt que la list.sortméthode, qui crée une nouvelle liste plutôt que de trier l'existante sur place:
Pas besoin de lambda; il suffit d'utiliserkey = len
balpha
15
Cela va trier par ordre croissant (plus petite longueur des mots en haut), pour trier par ordre décroissant (plus petite longueur des mots en bas) ajouter un paramètre reverse = True
Ajay Gupta
Le xs.sort()jette "TypeError: sort () ne prend aucun argument de position". Au lieu de cela, il devrait êtrexs.sort(key=lambda x: len(x))
Salut-Angel
84
La même chose que dans la réponse d'Eli - en utilisant simplement un formulaire plus court, car vous pouvez sauter une lambdapartie ici.
Comment inverser le tri en fonction de la longueur?
user2922935
1
@ user2922935: Vous pouvez faire xs [:: - 1] pour inverser la liste déjà triée. Consultez l'article de Dan Bader ici: dbader.org/blog/python-reverse-list
Thyag
7
xs.sort(key=len, reverse=True)
Raz
5
Je voudrais ajouter comment la fonction de touche pythonique fonctionne lors du tri:
Modèle de conception Décorer-Sort-Undecorate:
La prise en charge par Python d'une fonction clé lors du tri est implémentée à l'aide de ce que l'on appelle le modèle de conception décorer-trier-non décorer.
Il se déroule en 3 étapes:
Chaque élément de la liste est temporairement remplacé par une version «décorée» qui inclut le résultat de la fonction clé appliquée à l'élément.
La liste est triée en fonction de l'ordre naturel des clés.
Les éléments décorés sont remplacés par les éléments d'origine.
Paramètre clé pour spécifier une fonction à appeler sur chaque élément de liste avant d'effectuer des comparaisons. docs
def lensort(list_1):
list_2=[];list_3=[]for i in list_1:
list_2.append([i,len(i)])
list_2.sort(key =lambda x : x[1])for i in list_2:
list_3.append(i[0])return list_3
Je peux le faire en utilisant les deux méthodes ci-dessous, en utilisant la fonction
def lensort(x):
list1 =[]for i in x:
list1.append([len(i),i])return sorted(list1)
lista =['a','bb','ccc','dddd']
a=lensort(lista)print([l[1]for l in a])
Dans un Liner utilisant Lambda, comme ci-dessous, a déjà répondu ci-dessus.
lista =['a','bb','ccc','dddd']
lista.sort(key =lambda x:len(x))print(lista)
lambda
; il suffit d'utiliserkey = len
xs.sort()
jette "TypeError: sort () ne prend aucun argument de position". Au lieu de cela, il devrait êtrexs.sort(key=lambda x: len(x))
La même chose que dans la réponse d'Eli - en utilisant simplement un formulaire plus court, car vous pouvez sauter une
lambda
partie ici.Créer une nouvelle liste:
Tri sur place:
la source
xs.sort(key=len, reverse=True)
Je voudrais ajouter comment la fonction de touche pythonique fonctionne lors du tri:
Modèle de conception Décorer-Sort-Undecorate:
La prise en charge par Python d'une fonction clé lors du tri est implémentée à l'aide de ce que l'on appelle le modèle de conception décorer-trier-non décorer.
Il se déroule en 3 étapes:
Chaque élément de la liste est temporairement remplacé par une version «décorée» qui inclut le résultat de la fonction clé appliquée à l'élément.
La liste est triée en fonction de l'ordre naturel des clés.
Les éléments décorés sont remplacés par les éléments d'origine.
Paramètre clé pour spécifier une fonction à appeler sur chaque élément de liste avant d'effectuer des comparaisons. docs
la source
Le moyen le plus simple de procéder est:
la source
Ecrivez une fonction lensort pour trier une liste de chaînes en fonction de leur longueur.
la source
Cela fonctionne pour moi!
la source
Je peux le faire en utilisant les deux méthodes ci-dessous, en utilisant la fonction
Dans un Liner utilisant Lambda, comme ci-dessous, a déjà répondu ci-dessus.
la source