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?

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

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

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


4

La forma más sencilla de hacerlo es:

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


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

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í!


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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.