Python-Sortierung

Am einfachsten sortieren Sie mit der Funktion sort(list). Sie verwendet eine Liste und gibt eine neue Liste mit diesen Elementen in sortierter Reihenfolge zurück. 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]

In der Regel wird eine Liste an die Funktion sortiert() übergeben. Tatsächlich kann jedoch jede Art von iterierbarer Sammlung als Eingabe verwendet werden. Die ältere list.sort()-Methode ist eine Alternative, die im Folgenden beschrieben wird. Die Funktion sort() scheint einfacher zu verwenden als sort(), daher empfehle ich die Verwendung von sort().

Die Funktion sort() kann durch optionale Argumente angepasst werden. Mit dem optionalen Argument "Reverse=True", z.B. sortiert(list, umgekehrt=True), wird rückwärts sortiert.

  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 key=

Für eine komplexere benutzerdefinierte Sortierung wird für "Sort()" die optionale Funktion "key=" angegeben, die eine Schlüsselfunktion angibt, die jedes Element vor dem Vergleich umwandelt. Die Schlüsselfunktion nimmt einen Wert an und gibt einen Wert zurück. Der zurückgegebene "Proxy"-Wert wird für die Vergleiche innerhalb der Sortierung verwendet.

Wenn Sie beispielsweise bei einer Liste von Zeichenfolgen key=len (die integrierte Funktion len()) angeben, werden die Zeichenfolgen nach Länge sortiert, von der kürzesten zum längsten. Die Sortierung ruft len() für jeden String auf, um die Liste der Proxy-Längenwerte zu erhalten, und sortiert dann mit diesen Proxy-Werten.

  strs = ['ccc', 'aaaa', 'd', 'bb']
  print(sorted(strs, key=len))  ## ['d', 'bb', 'ccc', 'aaaa']

Aufruf sortiert mit key=len

Ein weiteres Beispiel: Durch Angabe von „str.lower“ als Schlüsselfunktion kann bei der Sortierung erzwungen werden, dass Groß- und Kleinbuchstaben gleich behandelt werden:

  ## "key" argument specifying str.lower function to use for sorting
  print(sorted(strs, key=str.lower))  ## ['aa', 'BB', 'CC', 'zz']

Sie können auch Ihre eigene MyFn-Funktion 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 eine komplexere Sortierung wie das Sortieren nach Nachname und dann nach Vornamen können Sie die Funktionen itemgetter oder attrgetter 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() wird diese Liste mit der sort()-Methode für eine Liste in aufsteigender Reihenfolge sortiert, z. B. list.sort(). Die sort()-Methode ändert die zugrunde liegende Liste und gibt None zurück. Verwenden Sie sie daher wie folgt:

  alist.sort()            ## correct
  alist = blist.sort()    ## Incorrect. sort() returns None

Das oben Genannte ist ein sehr häufiges Missverständnis bezüglich sort(): Die sortierte Liste wird *nicht zurückgegeben*. Die sort()-Methode muss für eine Liste aufgerufen werden. Sie funktioniert mit keiner aufzählbaren Sammlung, die oben aufgeführte Funktion sort() funktioniert jedoch für alles. Die Methode sort() ist älter als die Funktion sort(), sodass Sie sie wahrscheinlich in älterem Code sehen werden. Bei der sort()-Methode muss keine neue Liste erstellt werden. Falls sich die zu sortierenden Elemente bereits in einer Liste befinden, kann die Methode deshalb etwas schneller ablaufen.

Tupel

Ein Tupel ist eine Gruppe von Elementen mit fester Größe, beispielsweise eine (x-, y-)-Koordinate. Tupel sind wie Listen, mit der Ausnahme, dass sie unveränderlich sind und nicht die Größe ändern (Tupel sind nicht unbedingt unveränderlich, da eines der enthaltenen Elemente änderbar sein könnte). Tupel spielen in Python eine Art "Struct"-Rolle – eine praktische Möglichkeit, ein kleines Werte-Bundle mit einer festen Größe zu übergeben. 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 der Größe 3 entspricht und eine Gruppe (x, y, z) enthält.

Zum Erstellen eines Tupels listen Sie die Werte in Klammern getrennt durch Kommas auf. Das „leere“ Tupel ist einfach ein leeres Paar von Klammern. Der Zugriff auf die Elemente in einem Tupel funktioniert wie eine Liste: len(), [ ], for, in usw.

  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 einzige Element ein Komma folgen.

  tuple = ('hi',)   ## size-1 tuple

In der Syntax ist das ein lustiger Fall, aber das Komma ist notwendig, um das Tupel vom gewöhnlichen Fall zu unterscheiden, also einen Ausdruck in Klammern zu setzen. In einigen Fällen können Sie die Klammer weglassen. Python erkennt dann in den Kommas, dass Sie ein Tupel benötigen.

Wenn Sie einem Tupel von Variablennamen derselben Größe ein Tupel zuweisen, werden alle entsprechenden Werte zugewiesen. Wenn die Tupel nicht dieselbe Größe haben, wird ein Fehler ausgegeben. Diese Funktion ist auch für Listen verfügbar.

  (x, y, z) = (42, 13, "hike")
  print(z)  ## hike
  (err_string, err_code) = Foo()  ## Foo() returns a length-2 tuple

Verständnis der Liste (optional)

Das Verständnis von Listen ist eine erweiterte Funktion, die in einigen Fällen hilfreich ist, aber für die Übungen nicht erforderlich ist und nicht erst am Anfang erlernt werden muss. Sie können diesen Abschnitt also überspringen. Ein Listenverständnis ist eine kompakte Methode, einen Ausdruck zu schreiben, der sich zu einer ganzen Liste erweitert. Angenommen, wir haben eine Listennumer [1, 2, 3, 4]. Hier ist der Listenverständnis zum Berechnen einer Liste ihrer 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 ] – die for var in list sieht wie eine reguläre „for“-Schleife aus, aber ohne den Doppelpunkt (:). Der expr links davon wird einmal für jedes Element ausgewertet, um die Werte für die neue Liste zu erhalten. Hier ist ein Beispiel mit Strings, bei dem jeder String in Großbuchstaben geändert wird und '!!!' angehängt ist:

  strs = ['hello', 'and', 'goodbye']

  shouting = [ s.upper() + '!!!' for s in strs ]
  ## ['HELLO!!!', 'AND!!!', 'GOODBYE!!!']

Sie können rechts neben der for-Schleife einen if-Test hinzufügen, um das Ergebnis einzugrenzen. Der if-Test wird für jedes Element und nur für die Elemente ausgewertet, bei denen der Test zutrifft.

  ## 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

Wenn Sie das Material in diesem Abschnitt üben möchten, probieren Sie spätere Aufgaben in list1.py mit Sortieren und Tupeln aus (in den Grundlagenübungen).