Warum verursacht '.sort ()', dass die Liste in Python 'None' ist?

8

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:

%Vor%

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.

    
Btuman 19.03.2012, 20:08
quelle

8 Antworten

17

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.

    
agf 19.03.2012, 20:11
quelle
9

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.

    
Steven Rumbalski 19.03.2012 20:28
quelle
4

.sort() gibt None zurück und sortiert die Liste an Ort und Stelle.

    
Omri Barel 19.03.2012 20:11
quelle
2

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:

%Vor%

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.

    
steveha 20.03.2012 01:38
quelle
1

list.sort() gibt keine Liste zurück - es ändert destruktiv die Liste, die Sie sortieren:

%Vor%

Das heißt, max findet das größte Element in einer Liste und ist effizienter als Ihre Methode.

    
Marcin 19.03.2012 20:13
quelle
0

In Python sort() ist eine Inplace-Operation. So gibt result.sort() None zurück, ändert aber result , um sortiert zu werden. Um dieses Problem zu vermeiden, überschreiben Sie result nicht, wenn Sie sort() aufrufen.

    
ely 19.03.2012 20:11
quelle
0

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.

    
Spencer Rathbun 19.03.2012 20:19
quelle
0

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.

   %Vor%

Wie Sie sehen können, haben Sie bei der Zuweisung von sort() nicht mehr den Listentyp.

    
PenguinCoder 19.03.2012 20:41
quelle

Tags und Links