Cómo ordenar con lambda en Python

5 minutos de lectura

avatar de usuario
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)

  • agregar clave de argumento de palabra clave = lambda x: x.modified resolverá el problema

    – shahjapan

    22 de septiembre de 2010 a las 5:53

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


avatar de usuario
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

avatar de usuario
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))

avatar de usuario
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.

avatar de usuario
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.

avatar de usuario
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))]

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad