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)

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.


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')]

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].

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.