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.
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:
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í.
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"])
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
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)
lambda
; solo usekey = len
xs.sort()
arroja "TypeError: sort () no toma argumentos posicionales". En su lugar debería serxs.sort(key=lambda x: len(x))
Lo mismo que en la respuesta de Eli, solo usando una forma más corta, porque puede omitir una
lambda
parte aquí.Creando nueva lista:
Clasificación in situ:
fuente
xs.sort(key=len, reverse=True)
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:
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.
La lista está ordenada según el orden natural de las claves.
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
fuente
La forma más sencilla de hacerlo es:
fuente
Escriba una función lensort para ordenar una lista de cadenas según la longitud.
fuente
¡Esto funciona para mí!
fuente
Puedo hacerlo usando los siguientes dos métodos, usando la función
En un Liner usando Lambda, como se muestra a continuación, ya se respondió anteriormente.
fuente