Ich versuche eine Python-Liste von int
s zu sortieren und benutze dann die .pop()
-Funktion, um die höchste zurückzugeben. Ich habe versucht, die Methode auf verschiedene Arten zu schreiben:
Ich habe es auch versucht
%Vor% In beiden Fällen bewirkt .sort()
, dass die Liste None
ist (was keine .pop()
-Funktion hat und einen Fehler zurückgibt). Wenn ich das .sort()
entferne, funktioniert es gut, gibt aber nicht das größte int
zurück, da die Liste nicht sortiert ist.
Entfernen Sie einfach die Zuweisung von
%Vor%nur verlassen
%Vor% Die sort
-Methode arbeitet direkt (sie ändert die vorhandene Liste), sodass keine Zuweisung erforderlich ist und None
zurückgegeben wird. Wenn Sie das Ergebnis dem Namen der Liste zuweisen, weisen Sie None
zu.
Es kann leicht (und effizienter) als One-Liner geschrieben werden:
%Vor% max
arbeitet in der linearen Zeit O (n), während die Sortierung O (nlogn) ist. Sie brauchen auch keine verschachtelten Listen-Comprehensions, ein einzelner Generator-Ausdruck reicht aus.
Dies
%Vor%sollte das sein
%Vor% Es ist eine Konvention in Python, dass Methoden, die Sequenzen mutieren, None
zurückgeben.
Überlegen Sie:
%Vor%Pythons Design und Geschichte FAQ gibt die Begründung hinter dieser Design-Entscheidung (in Bezug auf Listen):
Warum gibt
list.sort(
) die sortierte Liste nicht zurück?In Situationen, in denen Leistung eine Rolle spielt, erstellen Sie eine Kopie der Liste nur um es zu sortieren, wäre verschwenderisch. Daher sortiert
list.sort()
die Liste an Ort und Stelle. Um Sie daran zu erinnern, kehrt es nicht zurück die sortierte Liste. Auf diese Weise werden Sie nicht versehentlich verführt werden Überschreiben einer Liste, wenn Sie eine sortierte Kopie benötigen, aber auch behalten müssen die unsortierte Version herum.In Python 2.4 wurde eine neue eingebaute Funktion -
sorted()
- hinzugefügt. Diese Funktion erstellt eine neue Liste aus einem bereitgestellten iterable, sortiert sie und gibt es zurück.
.sort()
gibt None zurück und sortiert die Liste an Ort und Stelle.
Dies wurde bereits korrekt beantwortet: list.sort()
gibt None
zurück. Der Grund warum ist "Command-Query Separation":
Python gibt None
zurück, da jede Funktion etwas zurückgeben muss, und die Konvention ist, dass eine Funktion, die keinen nützlichen Wert erzeugt, None
zurückgeben soll.
Ich habe noch nie Ihre Konvention gesehen, nach der Zeile, auf die sie verweist, einen Kommentar zu setzen, sondern den Kommentar mit einem Karat zu beginnen, um auf die Zeile zu zeigen. Bitte setzen Sie Kommentare vor die Zeilen, auf die sie verweisen.
Während Sie die Methode .pop()
verwenden können, können Sie die Liste auch einfach indizieren. Der letzte Wert in der Liste kann immer mit -1
indiziert werden, weil negative Indizes in Python "um den Anfang" gehen und vom Ende rückwärts indizieren.
Aber wir können noch weiter vereinfachen. Der einzige Grund, warum Sie die Liste sortieren, ist, dass Sie ihren Maximalwert finden können. Dafür gibt es in Python eine eingebaute Funktion: max()
Die Verwendung von list.sort()
erfordert das Erstellen einer ganzen Liste. Sie ziehen dann einen Wert aus der Liste und verwerfen ihn. max()
verbraucht einen Iterator, ohne dass eine potenziell große Menge an Speicher zum Speichern der Liste zugewiesen werden muss.
Auch in Python bevorzugt die Community die Verwendung eines Codierungsstandards namens PEP 8. In PEP 8 sollten Sie Kleinbuchstaben für Funktionsnamen und einen Unterstrich zum Trennen von Wörtern anstelle von CamelCase verwenden.
Mit den obigen Kommentaren im Hinterkopf, hier ist meine Neufassung Ihrer Funktion:
%Vor% Innerhalb des Aufrufs von max()
haben wir einen "Generator-Ausdruck", der für jeden Wert in der Liste paths
eine Länge berechnet. max()
zieht Werte heraus und behält die größten, bis alle Werte erschöpft sind.
Aber jetzt ist klar, dass wir die paths
-Liste nicht wirklich brauchen. Hier ist die endgültige Version:
Ich glaube tatsächlich, dass die Version mit der expliziten Variable paths
etwas lesbarer ist, aber das ist nicht schrecklich, und wenn es eine große Anzahl von Pfaden gibt, bemerken Sie vielleicht eine Leistungsverbesserung, weil sie nicht aufgebaut und Zerstören der paths
Liste.
Gibt es einen Grund, die sortierte Funktion nicht zu verwenden? sort()
ist nur für Listen definiert, aber sorted()
funktioniert mit allen iterablen Funktionen und funktioniert so, wie Sie es erwarten. Siehe diesen Artikel zum Sortieren von Details.
Da es intern auch timsort verwendet, ist es sehr effizient, wenn Sie nach Schlüssel 1 sortieren und dann sortieren müssen auf Taste 2.
Sie brauchen keine benutzerdefinierte Funktion für das, was Sie erreichen möchten, Sie müssen zuerst die verwendeten Methoden verstehen!
sort()
eine Liste in Python macht es an Ort und Stelle , das heißt, die Rückkehr von sort()
ist None
. Die Liste selbst ist geändert , eine neue Liste wird nicht zurückgegeben.
Wie Sie sehen können, haben Sie bei der Zuweisung von sort()
nicht mehr den Listentyp.