HOWTO · Python

Lexikographische Ordnung in Python

Dieses Tutorial zeigt, was die lexikografische Reihenfolge in Python ist.

Auf dieser Seite

In Python werden Zeichenketten anhand ihrer Unicode-Codepoints von links nach rechts verglichen. Das erste unterschiedliche Zeichen entscheidet über die Reihenfolge; ist eine Zeichenkette Präfix der anderen, kommt die kürzere zuerst. Verwenden Sie sort(), um eine Liste direkt umzusortieren, sorted(), um ein sortiertes Ergebnis zu erstellen, und eine Schlüsselfunktion, wenn Sie eine andere Vergleichsregel benötigen.

Was lexikografische Ordnung in Python bedeutet

Bei der lexikografischen Ordnung werden Elemente von links nach rechts verglichen. An der ersten Stelle, an der sich zwei Elemente unterscheiden, kommt das Element mit dem kleineren Wert zuerst. Ist eine Folge Präfix der anderen, kommt die kürzere zuerst. Python vergleicht Zeichenketten anhand ihrer Unicode-Codepoints. Die Sortierung unterscheidet daher Groß- und Kleinschreibung und kann von den alphabetischen Erwartungen in einer bestimmten Sprache abweichen. Für eine Sortierung ohne Beachtung der Groß- und Kleinschreibung wählen Sie einen ausdrücklichen Schlüssel wie str.casefold.

Zeichenketten und Wörter lexikografisch sortieren

Mit list.sort() ordnen Sie eine Liste direkt um. Die Methode gibt None zurück. Verwenden Sie sorted(), wenn Sie eine neue Liste benötigen und das ursprüngliche Iterable unverändert lassen möchten. Ohne Schlüssel vergleicht Python Zeichenketten Zeichen für Zeichen.

Die Zeichenketten und die angezeigte Ausgabe im unveränderten Beispiel bleiben Englisch. Führen Sie dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

names = ["pear", "apple", "orange"]
names.sort()
print(names)
['apple', 'orange', 'pear']

Der optionale Parameter key legt den Wert fest, der für den Vergleich verwendet wird. sorted(names, key=str.casefold) sortiert beispielsweise ohne Unterscheidung zwischen Groß- und Kleinschreibung. Die gespeicherten Zeichenketten selbst werden dadurch nicht verändert.

Um die Wörter eines Satzes zu sortieren, teilen Sie ihn zuerst in eine Liste auf. Die Beispielwörter und die angezeigte Ausgabe bleiben im unveränderten Code Englisch:

sentence = "pear apple orange"
words = sentence.split()
words.sort()
print(words)
['apple', 'orange', 'pear']

split() trennt standardmäßig an zusammenhängenden Leerraumzeichen. Beim Sortieren dieser Wörter entsteht eine geordnete Liste; Satzzeichen bleiben dabei nicht als eigene Elemente erhalten, und der Satz wird nicht mit seinen ursprünglichen Abständen wiederhergestellt. Wenn diese Details wichtig sind, tokenisieren und formatieren Sie den Text nach den benötigten Regeln.

Zeichen in einer Zeichenkette sortieren

Zeichenketten sind unveränderlich. Sortieren Sie ihre Zeichen deshalb mit sorted() und verbinden Sie die resultierende Liste mit join() zu einer neuen Zeichenkette. Der unveränderte Beispieltext und die angezeigte Zeichenfolge bleiben Englisch:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

word = "delftstack"
ordered_word = "".join(sorted(word))
print(ordered_word)
acdefklstt

Das Ergebnis folgt der Codepoint-Reihenfolge und keiner sprachspezifischen alphabetischen Sortierregel. Wiederholte Zeichen bleiben erhalten. Soll die Sortierung die Groß- und Kleinschreibung ignorieren, übergeben Sie sorted() einen Schlüssel. Muss das Ergebnis den Kollationsregeln einer bestimmten Sprache entsprechen, verwenden Sie eine Kollationsbibliothek, statt anzunehmen, dass die Codepoint-Reihenfolge diesen Regeln entspricht.

Zahlen nach Zahlenwert statt lexikografisch sortieren

Python vergleicht Ganzzahlen nach ihrem Zahlenwert. Daher kommt 2 vor 10. Werden diese Werte in Zeichenketten umgewandelt, erfolgt der Vergleich Zeichen für Zeichen; dabei kommt "10" vor "2".

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

numbers = [1, 4, 5, 3, 10, 16, 12]
original = numbers.copy()
numbers.sort()
new_numbers = sorted(original)
print(numbers)
print(new_numbers)
print(original)
[1, 3, 4, 5, 10, 12, 16]
[1, 3, 4, 5, 10, 12, 16]
[1, 4, 5, 3, 10, 16, 12]

Beide Sortieraufrufe oben erzeugen eine numerisch aufsteigend sortierte Liste. sort() verändert die Liste selbst, während sorted() eine separate Liste zurückgibt. Sollen numerische Zeichenketten nach ihrem Zahlenwert sortiert werden, wandeln Sie sie im Schlüssel in Zahlen um, zum Beispiel mit sorted(values, key=int). So können die ursprünglichen Zeichenketten erhalten bleiben, falls ihre Formatierung wichtig ist.

Tupel nach einem ausgewählten Feld sortieren

Standardmäßig werden Tupel lexikografisch über ihre Felder hinweg sortiert: Python vergleicht zuerst die ersten Felder und bei Gleichstand die folgenden. Soll ein bestimmtes Feld das wichtigste Sortierkriterium sein, übergeben Sie eine Schlüsselfunktion. itemgetter(1) wählt das zweite Feld aus (Index 1). Die Beispielnamen und die angezeigte Ausgabe im unveränderten Code bleiben Englisch:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

from operator import itemgetter

produce = [(1, "pear"), (3, "orange"), (2, "banana")]
by_name = sorted(produce, key=itemgetter(1))
print(by_name)
[(2, 'banana'), (3, 'orange'), (1, 'pear')]

Das ausgewählte Feld bestimmt die primäre Sortierreihenfolge, während jedes vollständige Tupel zusammenbleibt. Eine Schlüsselfunktion kann auch ein Tupel zurückgeben, wenn mehrere Kriterien benötigt werden. Mit (record[1].casefold(), record[0]) sortieren Sie beispielsweise zuerst nach einem Namen ohne Beachtung der Groß- und Kleinschreibung und dann nach einer Kennung. Verwenden Sie sort() für eine Änderung direkt in der Liste oder sorted(), wenn die ursprüngliche Reihenfolge erhalten bleiben soll.