Domanda

Non capisco bene la sintassi dietro il file sorted() discussione:

key=lambda variable: variable[0]

Non lo è lambda arbitrario?Perché è variable dichiarato due volte in quello che sembra a dict?

È stato utile?

Soluzione

key è una funzione che verrà chiamata per trasformare gli elementi della collezione prima che vengano confrontati. Il parametro è passato a key Deve essere qualcosa che è richiamabile.

L'utilizzo di lambda crea una funzione anonima (che è richiamabile). In caso di sorted Il callo prende solo un parametro. Python's lambda è piuttosto semplice. Può solo fare e restituire una cosa davvero.

La sintassi di lambda è la parola lambda seguito dall'elenco dei nomi dei parametri, quindi un singolo blocco di codice. L'elenco dei parametri e il blocco di codice sono delineati dal colon. Questo è simile ad altri costrutti in Python come while, for, if e così via. Sono tutte dichiarazioni che in genere hanno un blocco di codice. Lambda è solo un'altra istanza di una dichiarazione con un blocco di codice.

Possiamo confrontare l'uso di Lambda con quello di DEF per creare una funzione.

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

Lambda ci dà solo un modo per farlo senza assegnare un nome. Il che lo rende ottimo per l'utilizzo come parametro per una funzione.

variable viene usato due volte qui perché sulla mano sinistra del colon è il nome di un parametro e sul lato destro viene utilizzato nel blocco di codice per calcolare qualcosa.

Altri suggerimenti

Penso che tutte le risposte qui coprano il nocciolo di ciò che fa la funzione lambda nel contesto di sorted() abbastanza bene, tuttavia ho ancora la sensazione che manchi una descrizione che porti a una comprensione intuitiva, quindi ecco i miei due centesimi.

Per ragioni di completezza, dirò subito l'ovvio:sorted() restituisce una lista di elementi ordinati e se vogliamo ordinare in un modo particolare o se vogliamo ordinare una lista complessa di elementi (es.elenchi annidati o un elenco di tuple) possiamo invocare l'argomento chiave.

Per me, la comprensione intuitiva dell'argomento chiave, del motivo per cui deve essere richiamabile e l'uso di lambda come funzione richiamabile (anonima) per ottenere ciò si compone di due parti.

  1. Usare lamba in definitiva significa che non devi scrivere (definire) un'intera funzione, come quella sbblom fornito un esempio di.Le funzioni Lambda vengono create, utilizzate e immediatamente distrutte, in modo da non appesantire il tuo codice con altro codice che verrà utilizzato solo una volta.Questa, a quanto ho capito, è l'utilità principale della funzione lambda e le sue applicazioni per tali ruoli sono ampie.La sua sintassi è puramente per convenzione, che è in sostanza la natura della sintassi programmatica in generale.Impara la sintassi e finiscila.

La sintassi Lambda è la seguente:

lambda variabile_di_input: gustosa una fodera

per esempio.

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. L'idea alla base di key L'argomento è che dovrebbe contenere una serie di istruzioni che essenzialmente indicheranno la funzione 'sorted()' a quegli elementi dell'elenco che dovrebbero essere utilizzati per l'ordinamento.Quando si dice key=, ciò che significa realmente è:Mentre scorro l'elenco un elemento alla volta (ad es.for e in list), passerò l'elemento corrente alla funzione che fornisco nell'argomento chiave e lo userò per creare un elenco trasformato che mi informerà sull'ordine dell'elenco ordinato finale.

Controlla:

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

Esempio base:

sorted(mylist)

[2, 3, 3, 4, 6, 8, 23] # tutti i numeri sono in ordine dal piccolo al grande.

Esempio 1:

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

[3, 3, 23, 6, 2, 4, 8] # Questo risultato ordinato ha senso intuitivo per te?

Si noti che la mia funzione lambda ha detto a sorted di verificare se (e) era pari o dispari prima dell'ordinamento.

MA ASPETTA!Potresti (o forse dovresti) chiederti due cose: in primo luogo, perché le mie quote vengono prima dei miei pari (dal momento che il mio valore chiave sembra dire alla mia funzione ordinata di dare priorità ai pari utilizzando l'operatore mod in x%2==0).Secondo: perché i miei eventi sono fuori servizio?2 viene prima del 6, giusto?Analizzando questo risultato, impareremo qualcosa di più profondo su come funziona l'argomento 'key' sorted(), specialmente in combinazione con la funzione lambda anonima.

In primo luogo, noterai che mentre le probabilità vengono prima dei pari, i pari stessi non vengono classificati.Perchè è questo?? Leggiamo i documenti:

Funzioni chiave A partire da Python 2.4, sia List.sort () che Ordined () hanno aggiunto un parametro chiave per specificare una funzione da chiamare su ciascun elemento di elenco prima di fare confronti.

Dobbiamo leggere un po' tra le righe qui, ma ciò che ci dice è che la funzione di ordinamento viene chiamata solo una volta e se specifichiamo l'argomento chiave, allora ordiniamo in base al valore a cui ci indirizza la funzione chiave.

Quindi cosa restituisce l'esempio utilizzando un modulo?Un valore booleano: True == 1, False == 0.Allora come fa sorted a gestire questa chiave?Fondamentalmente trasforma l'elenco originale in una sequenza di 1 e 0.

[3,6,3,2,4,8,23] diventa [0,1,0,1,1,1,0]

Ora stiamo arrivando da qualche parte.Cosa ottieni quando ordini l'elenco trasformato?

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

Ok, ora sappiamo perché le probabilità vengono prima dei pari.Ma la domanda successiva è:Perché il 6 viene ancora prima del 2 nella mia lista finale?Beh, è ​​facile: è perché l'ordinamento avviene una sola volta!cioè.Quegli 1 rappresentano ancora i valori della lista originale, che si trovano nelle loro posizioni originali l'uno rispetto all'altro.Poiché l'ordinamento avviene solo una volta e non chiamiamo alcun tipo di funzione di ordinamento per ordinare i valori pari originali dal più basso al più alto, tali valori rimangono nel loro ordine originale l'uno rispetto all'altro.

La domanda finale è allora questa:Come penso concettualmente a come l'ordine dei miei valori booleani viene trasformato nei valori originali quando stampo l'elenco ordinato finale?

Sorted() è un metodo integrato che (fatto curioso) utilizza un algoritmo di ordinamento ibrido chiamato Timsort che combina aspetti dell'ordinamento per unione e ordinamento per inserimento.Mi sembra chiaro che quando lo chiami, c'è una meccanica che mantiene questi valori in memoria e li raggruppa con la loro identità booleana (maschera) determinata dalla (...!) funzione lambda.L'ordine è determinato dalla loro identità booleana calcolata dalla funzione lambda, ma tieni presente che queste sottoliste (di uno e zeri) non sono ordinate in base ai loro valori originali.Pertanto, l'elenco finale, sebbene organizzato in base a Pari e Dispari, non è ordinato per sottoelenco (i pari in questo caso sono fuori ordine).Il fatto che le quote siano ordinate è perché erano già in ordine per coincidenza nella lista originale.La conclusione da tutto ciò è che quando lambda esegue questa trasformazione, l'ordine originale delle sottoliste viene mantenuto.

Allora come si collega tutto questo alla domanda originale e, cosa più importante, alla nostra intuizione su come dovremmo implementare sorted() con il suo argomento chiave e lambda?

Quella funzione lambda può essere pensata come un puntatore che punta ai valori in base a cui dobbiamo ordinare, sia che si tratti di un puntatore che mappa un valore sul suo valore booleano trasformato dalla funzione lambda, o se si tratta di un particolare elemento in un elenco annidato, tupla, dict, ecc., sempre determinati dalla funzione lambda.

Proviamo a prevedere cosa succede quando eseguo il seguente codice.

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

Mio sorted la chiamata ovviamente dice: "Ordina questo elenco".L'argomento chiave lo rende un po' più specifico dicendo, per ogni elemento (x) in mylist, return index 1 di quell'elemento, quindi ordina tutti gli elementi dell'elenco originale "mylist" in base all'ordinamento dell'elenco calcolato dalla funzione lambda.Dato che abbiamo una lista di tuple, possiamo restituire un elemento indicizzato da quella tupla.Quindi otteniamo:

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

Esegui quel codice e scoprirai che questo è l'ordine.Prova a indicizzare un elenco di numeri interi e scoprirai che il codice si interrompe.

Questa è stata una spiegazione prolissa, ma spero che questo aiuti a "ordinare" la tua intuizione sull'uso delle funzioni lambda come argomento chiave in sorted() e oltre.

lambda è una parola chiave Python a cui viene utilizzata generare funzioni anonime.

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

Il variable a sinistra del : è un nome di parametro. L'utilizzo di variable A destra sta utilizzando il parametro.

Significa quasi esattamente lo stesso di:

def some_method(variable):
  return variable[0]

lambda è una funzione anonima, non una funzione arbitraria. Il parametro accettato sarebbe la variabile con cui stai lavorando e la colonna in cui lo stai risolvendo.

Un altro esempio di utilizzo smistato() funzione con key = lambda. Consideriamo che hai un elenco di tuple. In ogni tupla hai un marchio, un modello e un peso dell'auto e vuoi ordinare questo elenco di tuple per marchio, modello o peso. Puoi farlo con Lambda.

cars = [('citroen', 'xsara', 1100), ('lincoln', 'navigator', 2000), ('bmw', 'x5', 1700)]

print(sorted(cars, key=lambda car: car[0]))
print(sorted(cars, key=lambda car: car[1]))
print(sorted(cars, key=lambda car: car[2]))

Risultati:

[('bmw', 'x5', '1700'), ('citroen', 'xsara', 1100), ('lincoln', 'navigator', 2000)]
[('lincoln', 'navigator', 2000), ('bmw', 'x5', '1700'), ('citroen', 'xsara', 1100)]
[('citroen', 'xsara', 1100), ('bmw', 'x5', 1700), ('lincoln', 'navigator', 2000)]

Dall'utilizzo di Lambda è stato chiesto nel contesto di sorted(), dai un'occhiata anche a questo https://wiki.python.org/moin/howto/sorting/#key_functions

Solo per riformulare, la chiave (facoltativa. Una funzione da eseguire per decidere l'ordine. L'impostazione non è) nelle funzioni ordinate si aspetta una funzione e si utilizza lambda.

Per definire Lambda, si specifica la proprietà dell'oggetto che si desidera ordinare e la funzione ordinata incorporata di Python si prenderà automaticamente cura di essa.

Se si desidera ordinare per più proprietà, assegnare key = lambda x: (Property1, Property2).

Per specificare l'ordine-by, passa inversa = true come terzo argomento (facoltativo. Un falso booleano. Ordinerà ascendente, true ordinerà la decrescenza. L'impostazione predefinita è falsa) della funzione ordinata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top