Cómo ordenar con lambda en Python

179

En Python, estoy tratando de ordenar por fecha con lambda. No puedo entender mi mensaje de error. El mensaje es:

<lambda>() takes exactly 1 argument (2 given)

La linea que tengo es

a = sorted(a, lambda x: x.modified, reverse=True)
Niklas R.
fuente
8
agregar keywoard argumento key = lambda x: x.modified resolverá el problema
shahjapan

Respuestas:

325

Utilizar

a = sorted(a, key=lambda x: x.modified, reverse=True)
#             ^^^^

En Python 2.x, la sortedfunción toma sus argumentos en este orden:

sorted(iterable, cmp=None, key=None, reverse=False)

así que sin la key=función que pases se considerará una cmpfunción que toma 2 argumentos.

kennytm
fuente
13
Tiene una buena oportunidad de aprender a apreciar el parámetro de palabra clave que pasa de esta experiencia.
Tony Veijalainen
1
Esto es muy antiguo pero, ¿tienes alguna idea de por qué el código de error es engañoso? ¿Su respuesta parece posible que Python esté suministrando lambdaotro parámetro ya que una cmpfunción toma 2?
SuperBiasedMan
@SuperBiasedMan el error no es engañoso. cmp, una función de comparación toma dos argumentos. Si no especifica que está pasando un a key, se asume por el orden de los parámetros de función que está pasando un comparador. Su lambda toma un parámetro, por lo tanto, no es un comparador válido y eso es lo que dice el error.
Jezor
19
lst = [('candy','30','100'), ('apple','10','200'), ('baby','20','300')]
lst.sort(key=lambda x:x[1])
print(lst)

Se imprimirá de la siguiente manera:

[('apple', '10', '200'), ('baby', '20', '300'), ('candy', '30', '100')]
Trillonario Sanai
fuente
Esto no funciona para enteros de cadena. ¡Mira esto! lst = [('999', '9'), ('303', '30'), ('343', '34')] lst.sort (clave = lambda x: x [1]) print (lst )
Daniel Kua
El resultado es [('303', '30'), ('343', '34'), ('999', '9')] que no está ordenado en base al segundo elemento en cada lista.
Daniel Kua
lst = [('candy', '999', '9'), ('apple', '303', '30'), ('baby', '343', '34')] lst.sort (clave = lambda x: x [2]) print (lst)
Daniel Kua
[('manzana', '303', '30'), ('bebé', '343', '34'), ('dulce', '999', '9')]. ¡Que no está ordenado en base a 2 elementos también!
Daniel Kua
8

Las listas de Python tienen dos formas integradas de ordenar datos:

sort()  A method that modifies the list in-place
sorted()  A built-in function that builds a new sorted list from an iterable

Según sus requisitos, puede elegir entre estos dos:

si desea mantener la lista original, puede usar la función ordenada o si no necesita la lista original, puede usar la función ordenar.

Antes de continuar ordenado o ordenado, necesitamos entender lambda.

Una lambda es una función anónima y una función anónima es una función que se define sin nombre, esta publicación parece explicarlo muy bien.

https://www.programiz.com/python-programming/anonymous-function

Las funciones Lambda son buenas para llamar en línea porque solo tienen una expresión que se evalúa y devuelve. La sintaxis de una lambda es:

argumentos lambda: expresión

veamos cómo usar la función ordenada:

student_tuples = [('john', 'A', 15),('jane', 'B', 12),('dave', 'B', 10),]
sorted(student_tuples, key=lambda student: student[2]) 

salida: [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

Aquí podemos ver que la lista student_tuples que tiene tuplas está ordenada según el parámetro clave siempre que sea student [2].

Preeti Duhan
fuente