Saltar al contenido

Sintaxis detrás de ordenado (key= lambda: …)

Te damos la bienvenida a nuestra página web, ahora hallarás la respuesta a lo que estabas buscando.

Solución:

key es una función que se llamará para transformar los elementos de la colección antes de compararlos. El parámetro pasado a key debe ser algo invocable.

El uso de lambda crea una función anónima (que se puede llamar). En el caso de sorted el invocable solo toma un parámetro. Python lambda es bastante simple. En realidad, solo puede hacer y devolver una cosa.

La sintaxis de lambda es la palabra lambda seguido de la lista de nombres de parámetros y luego un solo bloque de código. La lista de parámetros y el bloque de código están delimitados por dos puntos. Esto es similar a otras construcciones en Python, así como while, for, if etcétera. Todas son declaraciones que normalmente tienen un bloque de código. Lambda es solo otra instancia de una declaración con un bloque de código.

Podemos comparar el uso de lambda con el de def para crear una función.

adder_lambda = lambda parameter1,parameter2: parameter1+parameter2
def adder_regular(parameter1, parameter2): return parameter1+parameter2

lambda simplemente nos da una forma de hacer esto sin asignar un nombre. Lo que lo hace ideal para usarlo como parámetro de una función.

variable se usa dos veces aquí porque en el lado izquierdo de los dos puntos está el nombre de un parámetro y en el lado derecho se usa en el bloque de código para calcular algo.

Creo que todas las respuestas aquí cubren el núcleo de lo que hace la función lambda en el contexto de sorted () bastante bien, sin embargo, todavía siento que falta una descripción que conduzca a una comprensión intuitiva, así que aquí está mi granito de arena.

En aras de la integridad, diré lo obvio desde el principio: sorted () devuelve una lista de elementos ordenados y si queremos ordenar de una manera particular o si queremos ordenar una lista compleja de elementos (por ejemplo, listas anidadas o una lista de tuplas) podemos invocar el key argumento.

Para mí, la comprensión intuitiva de la key argumento, por qué tiene que ser invocable, y el uso de lambda como la función invocable (anónima) para lograr esto viene en dos partes.

  1. Usar lamba en última instancia significa que no tiene que escribir (definir) una función completa, como la sblom proporcionó un ejemplo de. Las funciones de Lambda se crean, usan y destruyen de inmediato, por lo que no modifican su código con más código que solo se usará una vez. Esta, según tengo entendido, es la utilidad principal de la función lambda y sus aplicaciones para tales roles son amplias. Su sintaxis es puramente por convención, que es en esencia la naturaleza de la sintaxis programática en general. Aprenda la sintaxis y termine con ella.

La sintaxis de Lambda es la siguiente:

lambda input_variable (s): sabroso un trazador de líneas

p.ej

In [1]: f00 = lambda x: x/2

In [2]: f00(10)
Out[2]: 5.0

In [3]: (lambda x: x/2)(10)
Out[3]: 5.0

In [4]: (lambda x, y: x / y)(10, 2)
Out[4]: 5.0

In [5]: (lambda: 'amazing lambda')() # func with no args!
Out[5]: 'amazing lambda'
  1. La idea detrás del key El argumento es que debe incluir un conjunto de instrucciones que esencialmente apunten a la función ‘sorted ()’ a los elementos de la lista que deben usarse para ordenar. Cuando dice key=, lo que realmente significa es: a medida que recorro la lista un elemento a la vez (es decir, para e en la lista), voy a pasar el elemento actual a la función que proporciono en el key argumento y utilícelo para crear una lista transformada que me informará sobre el orden de la lista ordenada final.

Echale un vistazo:

mylist = [3,6,3,2,4,8,23]
sorted(mylist, key=WhatToSortBy)

Ejemplo básico:

sorted(mylist)

[2, 3, 3, 4, 6, 8, 23] # todos los números están ordenados de menor a mayor.

Ejemplo 1:

mylist = [3,6,3,2,4,8,23]
sorted(mylist, key=lambda x: x%2==0)

[3, 3, 23, 6, 2, 4, 8] # ¿Este resultado ordenado tiene un sentido intuitivo para usted?

Observe que mi función lambda dijo sorted para verificar si (e) era par o impar antes de ordenar.

¡PERO ESPERA! Puede (o tal vez debería) preguntarse dos cosas: primero, ¿por qué mis probabilidades vienen antes que mis pares (ya que mi key value parece decirle a mi función ordenada que priorice pares usando el operador mod en x%2==0). En segundo lugar, ¿por qué mis pares están desordenados? 2 viene antes que 6, ¿verdad? Al analizar este resultado, aprenderemos algo más profundo sobre cómo sorted () ‘keyEl argumento ‘funciona, especialmente en conjunto con la función lambda anónima.

En primer lugar, notará que, si bien las probabilidades vienen antes de los pares, los pares en sí mismos no se ordenan. ¿¿Por qué es esto?? Leamos los documentos:

Funciones clave Comenzando con Python 2.4, tanto list.sort () como sorted () agregaron un key parámetro para especificar una función que se llamará en cada elemento de la lista antes de hacer comparaciones.

Tenemos que leer un poco entre líneas aquí, pero lo que esto nos dice es que la función de clasificación solo se llama una vez, y si especificamos el key argumento, luego ordenamos por el valor que key la función nos apunta.

Entonces, ¿qué devuelve el ejemplo que usa un módulo? Un valor booleano: True == 1, False == 0. Entonces, ¿cómo soluciona este problema? key? Básicamente, transforma la lista original en una secuencia de unos y ceros.

[3,6,3,2,4,8,23] se convierte en [0,1,0,1,1,1,0]

Ahora estamos llegando a alguna parte. ¿Qué obtiene cuando ordena la lista transformada?

[0,0,0,1,1,1,1]

Bien, ahora sabemos por qué las probabilidades vienen antes que los pares. Pero la siguiente pregunta es: ¿Por qué el 6 todavía viene antes del 2 en mi lista final? Bueno, eso es fácil, ¡es porque la clasificación solo ocurre una vez! es decir, esos 1 todavía representan los valores de la lista original, que se encuentran en sus posiciones originales entre sí. Dado que la clasificación solo ocurre una vez, y no llamamos a ningún tipo de función de clasificación para ordenar los valores pares originales de menor a mayor, esos valores permanecen en su orden original entre sí.

La pregunta final es entonces esta: ¿Cómo pienso conceptualmente acerca de cómo el orden de mis valores booleanos se transforma de nuevo a los valores originales cuando imprimo la lista ordenada final?

Sorted () es un método integrado que (dato curioso) utiliza un algoritmo de ordenación híbrido llamado Timsort que combina aspectos de ordenación por fusión y ordenación por inserción. Me parece claro que cuando lo llama, hay una mecánica que mantiene estos valores en la memoria y los agrupa con su identidad booleana (máscara) determinada por (…!) La función lambda. El orden está determinado por su identidad booleana calculada a partir de la función lambda, pero tenga en cuenta que estas sublistas (de uno y ceros) no están ordenadas por sus valores originales. Por lo tanto, la lista final, aunque está organizada por probabilidades y pares, no está ordenada por sublista (los pares en este caso están desordenados). El hecho de que las probabilidades estén ordenadas se debe a que ya estaban ordenadas por coincidencia en la lista original. La conclusión de todo esto es que cuando lambda hace esa transformación, se retiene el orden original de las sublistas.

Entonces, ¿cómo se relaciona todo esto con la pregunta original y, lo que es más importante, nuestra intuición sobre cómo debemos implementar sorted () con su key argumento y lambda?

Esa función lambda se puede considerar como un puntero que apunta a los valores por los que necesitamos ordenar, ya sea un puntero mapeando un valor a su booleano transformado por la función lambda, o si es un elemento particular en una lista anidada, tupla, dict, etc., nuevamente determinado por la función lambda.

Intentemos predecir lo que sucede cuando ejecuto el siguiente código.

mylist = [(3, 5, 8), (6, 2, 8), ( 2, 9, 4), (6, 8, 5)]
sorted(mylist, key=lambda x: x[1])

Mi sorted llamar obviamente dice, “Por favor, ordene esta lista”. los key El argumento lo hace un poco más específico al decir, para cada elemento (x) en mylist, devuelva el índice 1 de ese elemento, luego ordene todos los elementos de la lista original ‘mylist’ por el orden de clasificación de la lista calculada por el lambda función. Como tenemos una lista de tuplas, podemos devolver un elemento indexado de esa tupla. Entonces obtenemos:

[(6, 2, 8), (3, 5, 8), (6, 8, 5), (2, 9, 4)]

Ejecute ese código y encontrará que este es el orden. Intente indexar una lista de números enteros y encontrará que el código se rompe.

Esta fue una explicación larga, pero espero que esto ayude a ‘ordenar’ su intuición sobre el uso de funciones lambda como key argumento en sorted () y más allá.

lambda es una palabra clave de Python que se utiliza para generar funciones anónimas.

>>> (lambda x: x+2)(3)
5

Aquí puedes ver las comentarios y valoraciones de los usuarios

Si conservas algún titubeo o forma de modernizar nuestro tutorial puedes ejecutar una glosa y con gusto lo analizaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *