Jak sortować za pomocą lambda w Pythonie

179

W Pythonie próbuję sortować według daty za pomocą lambda. Nie rozumiem komunikatu o błędzie. Wiadomość brzmi:

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

Linia, którą mam, to

a = sorted(a, lambda x: x.modified, reverse=True)
Niklas R.
źródło
8
dodaj argument keywoard key = lambda x: x.modified rozwiąże problem
shahjapan

Odpowiedzi:

325

Posługiwać się

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

W Pythonie 2.x sortedfunkcja przyjmuje argumenty w następującej kolejności:

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

więc bez tego key=funkcja, którą przekazujesz, będzie uważana za cmpfunkcję, która przyjmuje 2 argumenty.

kennytm
źródło
13
Masz dużą szansę nauczyć się doceniać przekazywanie parametrów słów kluczowych z tego doświadczenia.
Tony Veijalainen
1
To jest bardzo stare, ale czy masz pojęcie, dlaczego kod błędu jest mylący? Twoja odpowiedź brzmi tak, jakby możliwe, że Python dostarcza lambdainny parametr, ponieważ cmpfunkcja zajmuje 2?
SuperBiasedMan
@SuperBiasedMan błąd nie wprowadza w błąd. cmp, funkcja komparatora przyjmuje dwa argumenty. Jeśli nie określisz, że przekazujesz a key, zakłada się , że z kolejności parametrów funkcji przekazujesz komparator. Twoja lambda przyjmuje jeden parametr, dlatego nie jest prawidłowym komparatorem i tak mówi błąd.
Jezor
19
lst = [('candy','30','100'), ('apple','10','200'), ('baby','20','300')]
lst.sort(key=lambda x:x[1])
print(lst)

Zostanie wydrukowane w następujący sposób:

[('apple', '10', '200'), ('baby', '20', '300'), ('candy', '30', '100')]
Trillionaire Sanai
źródło
Nie działa to w przypadku liczb całkowitych typu string. Sprawdź to! lst = [('999', '9'), ('303', '30'), ('343', '34')] lst.sort (klucz = lambda x: x [1]) print (lst )
Daniel Kua
Wynik to [(„303”, „30”), („343”, „34”), („999”, „9”)], które nie jest sortowane na podstawie drugiego elementu na każdej liście.
Daniel Kua
lst = [('candy', '999', '9'), ('apple', '303', '30'), ('baby', '343', '34')] lst.sort (klucz = lambda x: x [2]) print (lst)
Daniel Kua
[(„jabłko”, „303”, „30”), („dziecko”, „343”, „34”), („cukierek”, „999”, „9”)]. Który nie jest również sortowany na podstawie 2 elementów!
Daniel Kua
8

Listy Pythona mają dwa wbudowane sposoby sortowania danych:

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

W zależności od wymagań możesz wybrać jedną z dwóch:

jeśli chcesz zachować oryginalną listę, możesz użyć funkcji sortowania lub jeśli nie potrzebujesz oryginalnej listy, możesz użyć funkcji sortowania.

Zanim przejdziemy do sortowania lub sortowania, musimy zrozumieć lambdę.

Lambda to funkcja anonimowa, a funkcja anonimowa to funkcja zdefiniowana bez nazwy. Ten post wydaje się całkiem ładnie to wyjaśniać.

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

Funkcje lambda są przydatne do wywoływania in-line, ponieważ mają tylko jedno wyrażenie, które jest obliczane i zwracane. Składnia lambda to:

argumenty lambda: wyrażenie

zobaczmy, jak używać funkcji sortowanej:

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

wyjście: [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

Tutaj widzimy, że lista student_tuples posiadająca krotki jest posortowana w oparciu o kluczowy parametr pod warunkiem, że student [2].

Preeti Duhan
źródło