So sortieren Sie mit Lambda in Python

178

In Python versuche ich, mit Lambda nach Datum zu sortieren. Ich kann meine Fehlermeldung nicht verstehen. Die Nachricht lautet:

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

Die Linie, die ich habe, ist

a = sorted(a, lambda x: x.modified, reverse=True)
Niklas R.
quelle
8
add keywoard argument key = lambda x: x.modified wird das Problem lösen
shahjapan

Antworten:

325

Verwenden

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

Unter Python 2.x nimmt die sortedFunktion ihre Argumente in der folgenden Reihenfolge an:

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

Ohne das key=wird die Funktion, die Sie übergeben, als eine cmpFunktion betrachtet, die zwei Argumente akzeptiert.

kennytm
quelle
13
Sie haben gute Chancen zu lernen, die Schlüsselwortparameter zu schätzen, die aus dieser Erfahrung stammen.
Tony Veijalainen
1
Das ist sehr alt, aber haben Sie eine Idee, warum der Fehlercode irreführend ist? Ihre Antwort klingt wie möglich Python liefert einen lambdaanderen Parameter, da eine cmpFunktion 2?
SuperBiasedMan
@ SuperBiasedMan der Fehler ist nicht irreführend. cmpEine Komparatorfunktion akzeptiert zwei Argumente. Wenn Sie nicht angeben, dass Sie a übergeben key, wird aus der Reihenfolge der Funktionsparameter angenommen, dass Sie einen Komparator übergeben. Ihr Lambda nimmt einen Parameter an, ist daher kein gültiger Komparator, und das sagt der Fehler.
Jezor
18
lst = [('candy','30','100'), ('apple','10','200'), ('baby','20','300')]
lst.sort(key=lambda x:x[1])
print(lst)

Es wird wie folgt gedruckt:

[('apple', '10', '200'), ('baby', '20', '300'), ('candy', '30', '100')]
Trillionär Sanai
quelle
Dies funktioniert nicht für Ganzzahlen. Schau dir das an! lst = [('999', '9'), ('303', '30'), ('343', '34')] lst.sort (key = lambda x: x [1]) print (lst )
Daniel Kua
Das Ergebnis ist [('303', '30'), ('343', '34'), ('999', '9')], das nicht nach dem zweiten Element in jeder Liste sortiert ist.
Daniel Kua
lst = [('Süßigkeiten', '999', '9'), ('Apfel', '303', '30'), ('Baby', '343', '34')] lst.sort (Schlüssel = Lambda x: x [2]) print (lst)
Daniel Kua
[('Apfel', '303', '30'), ('Baby', '343', '34'), ('Süßigkeiten', '999', '9')]. Welches ist nicht nach 2 Elementen sortiert!
Daniel Kua
7

Python-Listen verfügen über zwei integrierte Möglichkeiten zum Sortieren von Daten:

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

Je nach Ihren Anforderungen können Sie zwischen diesen beiden Optionen wählen:

Wenn Sie die ursprüngliche Liste beibehalten möchten, können Sie die sortierte Funktion verwenden. Wenn Sie keine ursprüngliche Liste benötigen, können Sie die Sortierfunktion verwenden.

Bevor wir sortieren oder sortieren, müssen wir Lambda verstehen.

Ein Lambda ist eine anonyme Funktion und eine anonyme Funktion ist eine Funktion, die ohne Namen definiert ist. Dieser Beitrag scheint es ziemlich gut zu erklären.

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

Lambda-Funktionen eignen sich gut zum Inline-Aufruf, da sie nur einen Ausdruck haben, der ausgewertet und zurückgegeben wird. Die Syntax für ein Lambda lautet:

Lambda-Argumente: Ausdruck

Mal sehen, wie man die sortierte Funktion benutzt:

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

Ausgabe: [('Dave', 'B', 10), ('Jane', 'B', 12), ('John', 'A', 15)]

Hier sehen wir, dass die Liste student_tuples mit Tupeln nach Schlüsselparametern sortiert ist, vorausgesetzt, student [2].

Preeti Duhan
quelle