web-dev-qa-db-fra.com

Tri Python liste 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?

89
prosseek

Lorsque vous transmettez un lambda à sort, vous devez renvoyer un entier, pas 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 x est inférieur à y, 0 si x est égal à y, et 1 si x est supérieur à y.

Bien sûr, vous pouvez utiliser le paramètre key:

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

Ceci indique à la méthode sort d’ordonner en fonction de ce que la fonction key renvoie.

EDIT: Merci à balpha et Ruslan ci-dessous pour avoir signalé que vous pouvez simplement passer len directement en tant que paramètre clé de la fonction, éliminant ainsi la nécessité d’un lambda:

xs.sort(key = len)

Et comme Ruslan le souligne ci-dessous, vous pouvez également utiliser la fonction intégrée trié plutôt que la méthode list.sort, Qui crée une nouvelle liste plutôt que de trier la liste existante sur place:

print sorted(xs, key=len)
170
Eli Courtwright

La même chose que dans la réponse d'Eli - en utilisant simplement un formulaire plus court, car vous pouvez ignorer 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']
78
Ruslan Spivak

Je voudrais ajouter comment la fonction de clé Pythonic fonctionne lors du tri:

Modèle de conception Decorate-Sort-Undecorate:

La prise en charge par Python d’une fonction de clé lors du tri est mise en œuvre à l’aide de ce que l’on appelle le modèle de conception decorate-sort-undecorate.

Il se déroule en 3 étapes:

  1. Chaque élément de la liste est temporairement remplacé par une version "décorée" incluant le résultat de la fonction de 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é permettant de spécifier une fonction à appeler sur chaque élément de la liste avant d'effectuer des comparaisons. docs

4
James Sapam

Le moyen le plus simple de le faire est:

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

2
Chirag Patel

Ecrivez un objectif de fonction pour trier une liste de chaînes en fonction de la 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"])
1
Febin Stephen

Je peux le faire en utilisant 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 une doublure utilisant Lambda, comme ci-dessous, déjà répondu ci-dessus.

 lista = ['a', 'bb', 'ccc', 'dddd']
 lista.sort(key = lambda x:len(x))
 print(lista)
0
Aashutosh
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
Saurabh Ariyan