Ordenar la lista de Python según la longitud de la cadena

110

Quiero ordenar una lista de cadenas según la longitud de la cadena. Traté de usar sort de la siguiente manera, pero no parece darme el resultado correcto.

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é puede estar mal?

prosseek
fuente

Respuestas:

201

Cuando pasa un lambdato sort, debe devolver un número entero, no un booleano. Entonces, su código debería leerse de la siguiente manera:

xs.sort(lambda x,y: cmp(len(x), len(y)))

Tenga en cuenta que cmp es una función incorporada que cmp(x, y)devuelve -1 si xes menor que y, 0 si xes igual a yy 1 si xes mayor que y.

Por supuesto, en su lugar puede utilizar el keyparámetro:

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

Esto le dice al sortmétodo que ordene en función de lo que devuelva la función clave.

EDITAR: Gracias a balpha y Ruslan a continuación por señalar que puede pasar lendirectamente como parámetro clave a la función, eliminando así la necesidad de lambda:

xs.sort(key=len)

Y como Ruslan señala a continuación, también puede usar la función ordenada incorporada en lugar del list.sortmétodo, que crea una nueva lista en lugar de ordenar la existente en el lugar:

print(sorted(xs, key=len))
Eli Courtwright
fuente
32
No es necesario el lambda; solo usekey = len
balpha
15
Esto ordenará en orden ascendente (menor longitud de palabras en la parte superior), para ordenar en orden descendente (menor longitud de palabras en la parte inferior) agregue un parámetro reverse = True
Ajay Gupta
Los xs.sort()arroja "TypeError: sort () no toma argumentos posicionales". En su lugar debería serxs.sort(key=lambda x: len(x))
Hi-Angel
84

Lo mismo que en la respuesta de Eli, solo usando una forma más corta, porque puede omitir una lambdaparte aquí.

Creando nueva lista:

>>> xs = ['dddd','a','bb','ccc']
>>> sorted(xs, key=len)
['a', 'bb', 'ccc', 'dddd']

Clasificación in situ:

>>> xs.sort(key=len)
>>> xs
['a', 'bb', 'ccc', 'dddd']
Ruslan Spivak
fuente
5
¿Cómo puedo invertir la clasificación por longitud?
user2922935
1
@ user2922935: Puede hacer xs [:: - 1] para revertir la lista ya ordenada. Consulte el artículo de Dan Bader aquí: dbader.org/blog/python-reverse-list
Thyag
7
xs.sort(key=len, reverse=True)
Raz
5

Me gustaría agregar cómo funciona la función de tecla pitónica al ordenar:

Patrón de diseño Decorar-Clasificar-No decorar:

El soporte de Python para una función clave al ordenar se implementa utilizando lo que se conoce como patrón de diseño decorar-ordenar-no decorar.

Procede en 3 pasos:

  1. Cada elemento de la lista se reemplaza temporalmente con una versión "decorada" que incluye el resultado de la función clave aplicada al elemento.

  2. La lista está ordenada según el orden natural de las claves.

  3. Los elementos decorados son reemplazados por los elementos originales.

Parámetro clave para especificar una función que se llamará en cada elemento de la lista antes de realizar comparaciones. docs

James Sapam
fuente
4

La forma más sencilla de hacerlo es:

list.sort (clave = lambda x: len (x))

Chirag Patel
fuente
1

Escriba una función lensort para ordenar una lista de cadenas según la longitud.

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
fuente
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

¡Esto funciona para mí!

Saurabh Ariyan
fuente
0

Puedo hacerlo usando los siguientes dos métodos, usando la función

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

En un Liner usando Lambda, como se muestra a continuación, ya se respondió anteriormente.

 lista = ['a', 'bb', 'ccc', 'dddd']
 lista.sort(key = lambda x:len(x))
 print(lista)
Aashutosh
fuente