Come ordinare con lambda in Python


179

In Python, sto cercando di ordinare per data con lambda. Non riesco a capire il mio messaggio di errore. Il messaggio è:

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

La linea che ho è

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

8
aggiungi keywoard argomento key = lambda x: x.modified risolverà il problema
shahjapan

Risposte:


325

Uso

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

Su Python 2.x, la sortedfunzione accetta i suoi argomenti in questo ordine:

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

quindi senza il key=, la funzione che passi sarà considerata una cmpfunzione che accetta 2 argomenti.


13
Hai buone possibilità di imparare ad apprezzare il parametro delle parole chiave che passa da questa esperienza.
Tony Veijalainen,

1
Questo è molto vecchio ma, hai idea del perché il codice di errore sia fuorviante? La tua risposta sembra possibile Python sta fornendo lambdaun altro parametro dal momento che una cmpfunzione prende 2?
SuperBiasedMan

@SuperBiasedMan l'errore non è fuorviante. cmp, una funzione di confronto accetta due argomenti. Se non si specifica che si sta passando un key, si presuppone dall'ordine dei parametri della funzione che si sta passando un comparatore. Il tuo lambda accetta un parametro, quindi non è un comparatore valido ed è quello che dice l'errore.
Jezor,

19
lst = [('candy','30','100'), ('apple','10','200'), ('baby','20','300')]
lst.sort(key=lambda x:x[1])
print(lst)

Stampa come segue:

[('apple', '10', '200'), ('baby', '20', '300'), ('candy', '30', '100')]

Questo non funziona con numeri interi di stringhe. Controllalo! lst = [('999', '9'), ('303', '30'), ('343', '34')] lst.sort (key = lambda x: x [1]) print (lst )
Daniel Kua,

Il risultato è [('303', '30'), ('343', '34'), ('999', '9')] che non è ordinato in base al secondo elemento in ogni lista.
Daniel Kua,

lst = [('candy', '999', '9'), ('apple', '303', '30'), ('baby', '343', '34')] lst.sort (chiave = lambda x: x [2]) print (lst)
Daniel Kua

[('apple', '303', '30'), ('baby', '343', '34'), ('candy', '999', '9')]. Che non è ordinato in base anche su 2 elementi!
Daniel Kua,

8

Gli elenchi Python hanno due modi integrati per ordinare i dati:

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

In base alle tue esigenze puoi scegliere tra queste due:

se si desidera mantenere l'elenco originale, è possibile utilizzare la funzione di ordinamento o se non è necessario l'elenco originale è possibile utilizzare la funzione di ordinamento.

Prima di procedere con l'ordinamento o l'ordinamento, dobbiamo capire lambda.

Una lambda è una funzione anonima e una funzione anonima è una funzione definita senza nome, questo post sembra spiegarlo abbastanza bene.

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

Le funzioni Lambda sono utili per chiamare in linea perché hanno solo un'espressione che viene valutata e restituita. La sintassi per un lambda è:

argomenti lambda: espressione

vediamo come usare la funzione ordinata:

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

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

Qui possiamo vedere l'elenco student_tuples che ha tuple è ordinato in base al parametro chiave a condizione che sia student [2].

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.