Die einfachste Methode zum Sortieren ist die Funktion „Sorted(list)“, bei der anhand einer Liste eine neue Liste mit diesen Elementen in sortierter Reihenfolge zurückgegeben wird. Die ursprüngliche Liste wird nicht geändert.
a = [5, 1, 4, 3] print(sorted(a)) ## [1, 3, 4, 5] print(a) ## [5, 1, 4, 3]
Üblicherweise wird eine Liste an die Funktion sortiert() übergeben, tatsächlich kann aber jede Art von iterierbarer Sammlung als Eingabe verwendet werden. Die ältere Methode list.sort() ist eine Alternative, die im Folgenden beschrieben wird. Die Funktion sort() scheint im Vergleich zu sort() einfacher zu verwenden, deshalb empfehle ich die Verwendung der Funktion „Sorted()“.
Die Funktion sortier() kann durch optionale Argumente angepasst werden. Das optionale Argument „Sortiert()“ „Reverse=True“, z.B. sortiert(list, umgekehrt=True), sorgt dafür, dass die Sortierung rückwärts erfolgt.
strs = ['aa', 'BB', 'zz', 'CC'] print(sorted(strs)) ## ['BB', 'CC', 'aa', 'zz'] (case sensitive) print(sorted(strs, reverse=True)) ## ['zz', 'aa', 'CC', 'BB']
Benutzerdefinierte Sortierung mit Schlüssel=
Für komplexere benutzerdefinierte Sortierungen wird bei der Funktion „Sortiment()“ ein optionales Feld „key=" indem Sie einen „Schlüssel“ -Funktion, die jedes Element vor dem Vergleich transformiert. Die Schlüsselversion nimmt einen Wert an, gibt einen Wert zurück und gibt den zurückgegebenen Wert „proxy“ zurück. wird für die Vergleiche innerhalb der Sortierung verwendet.
Wenn Sie zum Beispiel bei einer Liste von Strings die Funktion „key=len“ (die integrierte Funktion „len()“) angeben, werden die Strings nach ihrer Länge sortiert – vom kürzesten zum längsten. Beim Sortieren wird für jeden String „len()“ aufgerufen, um die Liste der Proxy-Längenwerte abzurufen, und sortiert dann mit diesen Proxy-Werten.
strs = ['ccc', 'aaaa', 'd', 'bb'] print(sorted(strs, key=len)) ## ['d', 'bb', 'ccc', 'aaaa']
Ein weiteres Beispiel ist die Angabe von „str.lower“. da die Schlüsselversion eine Möglichkeit ist, das Sortieren so zu erzwingen, dass Groß- und Kleinschreibung identisch sind:
## "key" argument specifying str.lower function to use for sorting print(sorted(strs, key=str.lower)) ## ['aa', 'BB', 'CC', 'zz']
Sie können auch wie folgt Ihre eigene MyFn als Schlüsselfunktion übergeben:
## Say we have a list of strings we want to sort by the last letter of the string. strs = ['xc', 'zb', 'yd' ,'wa'] ## Write a little function that takes a string, and returns its last letter. ## This will be the key function (takes in 1 value, returns 1 value). def MyFn(s): return s[-1] ## Now pass key=MyFn to sorted() to sort by the last letter: print(sorted(strs, key=MyFn)) ## ['wa', 'zb', 'xc', 'yd']
Für komplexere Sortierungen wie Sortieren nach Nachname, dann nach Vorname, können Sie die itemgetter- oder attrgetter-Funktionen wie folgt verwenden:
from operator import itemgetter # (first name, last name, score) tuples grade = [('Freddy', 'Frank', 3), ('Anil', 'Frank', 100), ('Anil', 'Wang', 24)] sorted(grade, key=itemgetter(1,0)) # [('Anil', 'Frank', 100), ('Freddy', 'Frank', 3), ('Anil', 'Wang', 24)] sorted(grade, key=itemgetter(0,-1)) #[('Anil', 'Wang', 24), ('Anil', 'Frank', 100), ('Freddy', 'Frank', 3)]
sort()-Methode
Als Alternative zu sort() sortiert die sort()-Methode für eine Liste diese Liste in aufsteigender Reihenfolge, z.B. list.sort() enthält. Die sort()-Methode ändert die zugrunde liegende Liste und gibt "None" zurück. Verwenden Sie sie also so:
alist.sort() ## correct alist = blist.sort() ## Incorrect. sort() returns None
Dies ist ein sehr häufiges Missverständnis mit sort() - die sortierte Liste wird *nicht zurückgegeben*. Die sort()-Methode muss für eine Liste aufgerufen werden. Sie kann auf keine Aufzählungssammlungen angewendet werden, aber die obige Funktion sortiert() funktioniert für alles. Die Methode sort() liegt vor der Funktion sortiert(), daher ist sie wahrscheinlich auch in älterem Code zu sehen. Die sort()-Methode muss keine neue Liste erstellen, sodass sie etwas schneller geht, wenn sich die zu sortierenden Elemente bereits in einer Liste befinden.
Tupel
Ein Tupel ist eine Gruppierung von Elementen mit fester Größe, beispielsweise eine (x-, y)-Koordinate. Tupel sind wie Listen, nur dass sie unveränderlich sind und ihre Größe nicht ändern (Tupel sind nicht unbedingt unveränderlich, da eines der enthaltenen Elemente veränderbar sein könnte). Tupel spielen eine Art „Struct“ (Struktur) ab. Rolle in Python - eine bequeme Möglichkeit, ein kleines Werte-Bundle mit logischer Größe und fester Größe weiterzugeben. Eine Funktion, die mehrere Werte zurückgeben muss, kann einfach ein Tupel der Werte zurückgeben. Wenn ich beispielsweise eine Liste mit 3D-Koordinaten haben möchte, wäre die natürliche Python-Darstellung eine Liste von Tupeln, wobei jedes Tupel die Größe 3 hat und eine (x, y, z)-Gruppe enthält.
Um ein Tupel zu erstellen, listen Sie einfach die Werte in Klammern und durch Kommas getrennt auf. Das „leere“ Tupel ist nur ein leeres Klammerpaar. Der Zugriff auf die Elemente in einem Tupel funktioniert wie eine Liste – len(), [ ], for, in usw. funktionieren alle gleich.
tuple = (1, 2, 'hi') print(len(tuple)) ## 3 print(tuple[2]) ## hi tuple[2] = 'bye' ## NO, tuples cannot be changed tuple = (1, 2, 'bye') ## this works
Um ein Tupel der Größe 1 zu erstellen, muss auf das einzelne Element ein Komma folgen.
tuple = ('hi',) ## size-1 tuple
Das ist ein seltsamer Fall in der Syntax, aber das Komma ist erforderlich, um das Tupel vom gewöhnlichen Fall zu unterscheiden, bei dem ein Ausdruck in Klammern gesetzt wird. In einigen Fällen können Sie die Klammer weglassen und Python sieht bei den Kommas, dass Sie ein Tupel wünschen.
Wenn Sie einem Tupel von Variablennamen ein Tupel derselben Größe zuweisen, werden alle entsprechenden Werte zugewiesen. Wenn die Tupel nicht dieselbe Größe haben, wird ein Fehler ausgegeben. Diese Funktion kann auch für Listen verwendet werden.
(x, y, z) = (42, 13, "hike") print(z) ## hike (err_string, err_code) = Foo() ## Foo() returns a length-2 tuple
Listenverständnisse (optional)
Das Verstehen von Listen ist eine fortgeschrittenere Funktion, die in einigen Fällen nützlich ist, für die Übungen jedoch nicht benötigt wird und nicht unbedingt zuerst zu lernen ist (d.h., Sie können diesen Abschnitt überspringen). Ein Listenverständnis ist eine kompakte Möglichkeit, einen Ausdruck zu schreiben, der zu einer ganzen Liste erweitert wird. Angenommen, wir haben eine Liste mit den Zahlen [1, 2, 3, 4]. Hier ist das Listenverständnis zur Berechnung einer Liste der Quadrate [1, 4, 9, 16]:
nums = [1, 2, 3, 4] squares = [ n * n for n in nums ] ## [1, 4, 9, 16]
Die Syntax lautet [ expr for var in list ]
: for var in list
sieht aus wie eine reguläre For-Schleife, aber ohne den Doppelpunkt (:). Der expr links daneben wird einmal für jedes Element ausgewertet, um die Werte für die neue Liste zu erhalten. Hier ist ein Beispiel mit Strings, wobei jeder String durch '!!!' in Großbuchstaben geändert wird. angehängt:
strs = ['hello', 'and', 'goodbye'] shouting = [ s.upper() + '!!!' for s in strs ] ## ['HELLO!!!', 'AND!!!', 'GOODBYE!!!']
Um das Ergebnis einzugrenzen, können Sie rechts neben der For-Schleife einen if-Test einfügen. Der if-Test wird für jedes Element ausgewertet, also nur für die Elemente, für die der Test wahr ist.
## Select values <= 2 nums = [2, 8, 1, 6] small = [ n for n in nums if n <= 2 ] ## [2, 1] ## Select fruits containing 'a', change to upper case fruits = ['apple', 'cherry', 'banana', 'lemon'] afruits = [ s.upper() for s in fruits if 'a' in s ] ## ['APPLE', 'BANANA']
Übung: list1.py
Um das Material in diesem Abschnitt zu üben, versuchen Sie es mit späteren Aufgaben in list1.py, bei denen Sortierung und Tupel verwendet werden (siehe Grundlegende Übungen).