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?

prosseek
la source

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))
Eli Courtwright
la source
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']
Ruslan Spivak
la source
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

James Sapam
la source
4

Le moyen le plus simple de procéder est:

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

Chirag Patel
la source
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"])
Febin Stephen
la source
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!

Saurabh Ariyan
la source
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)
Aashutosh
la source