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?
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)
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']
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:
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.
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é permettant de spécifier une fonction à appeler sur chaque élément de la liste avant d'effectuer des comparaisons. docs
Le moyen le plus simple de le faire est:
list.sort (clé = lambda x: len (x))
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"])
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)
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!