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.

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']

Qu'est-ce qui ne va pas?

Réponses:


201

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:

print(sorted(xs, key=len))

32
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.

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']

5
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:

  1. 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.

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

  3. 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


4

Le moyen le plus simple de procéder est:

list.sort (clé = lambda x: len (x))


1

Ecrivez une fonction lensort pour trier une liste de chaînes en fonction de leur longueur.

def lensort(a):
    n = len(a)
    for i in range(n):
        for j in range(i+1,n):
            if len(a[i]) > len(a[j]):
                temp = a[i]
                a[i] = a[j]
                a[j] = temp
    return a
print lensort(["hello","bye","good"])

0
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

Cela fonctionne pour moi!


0

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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.