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 Rosencrantz
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)
Usar
a = sorted(a, key=lambda x: x.modified, reverse=True)
# ^^^^
En Python 2.x, el sorted
La función toma sus argumentos en este orden:
sorted(iterable, cmp=None, key=None, reverse=False)
así que sin el key=
la función que pase se considerará una cmp
función que toma 2 argumentos.
Tiene una buena oportunidad de aprender a apreciar el paso de parámetros de palabras clave a partir de esta experiencia.
-Tony Veijalainen
22 de septiembre de 2010 a las 6:42
Esto es muy antiguo pero, ¿tiene alguna idea de por qué el código de error es engañoso? Su respuesta parece posible que Python esté proporcionando lambda
con otro parámetro ya que cmp
función toma 2?
– SuperBiasedMan
2 de septiembre de 2015 a las 9:04
@SuperBiasedMan el error no es engañoso. cmp
, una función de comparación toma dos argumentos. Si no especifica que está pasando un key
, se asume a partir del orden de los parámetros de la 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
24 de mayo de 2018 a las 7:46
Python 2 y 3 parecen tener declaraciones de funciones diferentes. Uso Python 3, por lo que ya no hay cmp. En Python2, es un iterable
¿qué es en Python 3?
– Timo
24 de diciembre de 2020 a las 9:51
trillonario sanai
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')]
Esto no funciona para enteros de cadena. ¡Mira esto! lst = [(‘999’, ‘9’), (‘303′, ’30’), (‘343′, ’34’)] lst.sort(clave=lambda x: x[1]) imprimir (lst)
– Daniel Kúa
13 de junio de 2020 a las 4:26
El resultado es [(‘303′, ’30’), (‘343′, ’34’), (‘999’, ‘9’)] que no está ordenado según el segundo elemento de cada lista.
– Daniel Kúa
13 de junio de 2020 a las 4:26
lst = [(‘candy’,’999′,’9′), (‘apple’,’303′,’30’), (‘baby’,’343′,’34’)] lst.sort(clave=lambda x:x[2]) imprimir (lst)
– Daniel Kúa
13 de junio de 2020 a las 4:28
[(‘apple’, ‘303’, ’30’), (‘baby’, ‘343’, ’34’), (‘candy’, ‘999’, ‘9’)]. ¡Que no está ordenado en base a 2 elementos también!
– Daniel Kúa
13 de junio de 2020 a las 4:28
@DanielKua Eso es bastante simple de arreglar. solo puedes hacer int(x[1])
en lugar de solo x[1]
.
– M-Chen-3
16/03/2021 a las 20:53
Tiago Martín Peres
Está intentando usar funciones clave con funciones lambda.
Python y otros lenguajes como C# o F# usan funciones lambda.
Además, cuando se trata de funciones clave y de acuerdo con el documentación
Ambas cosas lista.ordenar() y ordenado () tener un parámetro clave para especificar una función que se llamará en cada elemento de la lista antes de hacer comparaciones.
…
El valor del parámetro clave debe ser una función que tome un solo argumento y devuelva una clave para usar con fines de clasificación. Esta técnica es rápida porque la función clave se llama exactamente una vez para cada registro de entrada.
Entonces, las funciones clave tienen una clave de parámetro y, de hecho, pueden recibir una función lambda.
En pitón real hay un buen ejemplo de su uso. Digamos que tienes la siguiente lista
ids = ['id1', 'id100', 'id2', 'id22', 'id3', 'id30']
y quiero ordenar a través de sus “enteros”. Entonces, harías algo como
sorted_ids = sorted(ids, key=lambda x: int(x[2:])) # Integer sort
e imprimirlo daría
['id1', 'id2', 'id3', 'id22', 'id30', 'id100']
En tu caso particular, solo te falta escribir key=
antes de lambda. Entonces, querrás usar lo siguiente
a = sorted(a, key=lambda x: x.modified, reverse=True)
En Python3:
from functools import cmp_to_key
def compare(i1,i2):
return i1-i2
events.sort(key=cmp_to_key(compare))
Alberto Mathews
Echa un vistazo a este ejemplo, lo entenderás:
Ejemplo 1:
a = input()
a = sorted(a, key = lambda x:(len(x),x))
print(a)
aporte: ["tim", "bob", "anna", "steve", "john","aaaa"]
producción: ['bob', 'tim', 'aaaa', 'anna', 'john', 'steve']
aporte: ["tim", "bob", "anna", "steve", "john","aaaaa"]
producción: ['bob', 'tim', 'anna', 'john', 'aaaaa', 'steve']
Ejemplo 2 (avanzado):
a = ["tim", "bob", "anna", "steve", "john","aaaaa","zzza"]
a = sorted(a, key = lambda x:(x[-1],len(x),x))
print(a)
producción: ['anna', 'zzza', 'aaaaa', 'bob', 'steve', 'tim', 'john']
Conclusión:
key = lambda x:(p1,p2,p3,p4,...,pn)
,
x
es un elemento a la vez del flujo de entrada.
p1,p2,p3...pn
siendo propiedades basadas en las cuales el flujo de elementos necesita ser ordenado.
basado en el orden de prioridad de p1>p2>p3>...>pn
.
También podemos agregar reverse=True, después de la condición de ordenación, para ordenar los elementos en orden inverso.
Chengcheng Xu
Excepto por otras respuestas completas, sé un gran página para que te sumerjas.
Usted puede encontrar por qué hay llave y cmp entre python2.x y python3.
esmerico
Otro excelente ejemplo de una función ordenada con lambda en Python3;
# list of sport teams with wins and losses
sportTeams = [("Royals", (18, 12)), ("Rockets", (24, 6)),
("Cardinals", (20, 10)), ("Dragons", (22, 8)),
("Kings", (15, 15)), ("Chargers", (20, 10)),
("Jets", (16, 14)), ("Warriors", (25, 5))]
# sort the teams by number of wins
sortedTeams = sorted(sportTeams, key=lambda t: t[1][0], reverse=True)
print(sortedTeams)
Producción:
[('Warriors', (25, 5)), ('Rockets', (24, 6)), ('Dragons', (22, 8)), ('Cardinals', (20, 10)), ('Chargers', (20, 10)), ('Royals', (18, 12)), ('Jets', (16, 14)), ('Kings', (15, 15))]
agregar clave de argumento de palabra clave = lambda x: x.modified resolverá el problema
– shahjapan
22 de septiembre de 2010 a las 5:53