Sortieren in Python
Der Argumentwert der Funktion ›sorted‹ muß ein Iterables sein.
Die Funktion ›sorted‹ ergibt eine Liste mit den in aufsteigender Reihenfolge sortierten Werten ihres Argumentobjekts.
- Konsolenprotokoll
sorted
<built-in function sorted>
sorted( dir() )
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
- Konsolenprotokoll
range( 10 )
range(0, 10)
sorted( _ )
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
sorted( range( 10 ))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Die gegebenen Beispiele sind nicht ganz überzeugen, da hier die Argumentobjekte bereits sortiert sind. Da eine str-Zeichenfolge ebenfalls iterabel ist, können wir sie als Beispiel für eine echte Sortierung heranziehen.
- Auswertung
"beispielsweise"
'beispielsweise'
sorted( _ )
['b', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'l', 'p', 's', 's', 's', 'w']
sorted( "beispielsweise" )
['b', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'l', 'p', 's', 's', 's', 'w']
- Konsolenprotokoll
sorted( Counter( "beispielsweise" ))
['b', 'e', 'i', 'l', 'p', 's', 'w']
sorted( Counter( "abc" ))== sorted( Counter( "acbb" ))
True
Übersicht Iterable und Aufrufbare
- Iteratoren (und damit auch Iterable)
- Ergebnisse von »enumerate«
from multiprocessing.pool import job_counter
job_counterfrom sys import stdin
stdin- Iterable
- alle Iteratoren
- str-Objekte (»"abc"«)
- list-Objekte (»dir()«)
- tuple-Objekte (»tuple()«)
from itertools import count
count()- range-Ergebnisse
- Counter-Objekte
- Aufrufbare, die Iteratoren akzeptieren
- »next«
- Aufrufbare, die Iterable akzeptieren
- »iter«
- »tuple«
- »sum« (nur Iterable, die Zahlen liefern)
- »min«
- »max«
- »sorted«
- »Counter« (nach »from collections import Counter«)
- ›str.join‹ (d.h. die join-Methode eines str-Objektes)
? Übungsfrage
Jemand möchte das Ergebnis von »dir()« mischen, also die Reihenfolge der Einträge verwürfeln. Er findet dazu die Funktion »shuffle« im Modul »random« und gibt die folgenden Kommandos ein.
- Konsoleneingabe
list_ = dir()
print( "list_ =", list_ )
list_ = ['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
from random import shuffle
print( shuffle( list_ ))
None
Es ergibt sich die Ausgabe »None«. Tatsächlich hatte der Programmierer aber eher etwas wie die folgenden Ausgabe erwartet.
- Erwartete Ausgabe
['__name__', '__builtins__', '__loader__', '__spec__', '__doc__', '__package__', '__annotations__']
Was muß der Programmierer schreiben, um solch eine Ausgabe zu sehen?
? Übungsfrage
Jemand möchte die Schriftzeichen des Wortes „beispielsweise“ sortieren. Er findet dazu die Funktion »sorted« und gibt die folgenden Kommandos ein.
- Konsoleneingabe
list_ = list( 'beispielsweise' )
print( list_ )
['b', 'e', 'i', 's', 'p', 'i', 'e', 'l', 's', 'w', 'e', 'i', 's', 'e']
sorted( list_ )
['b', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'l', 'p', 's', 's', 's', 'w']
print( list_ )
['b', 'e', 'i', 's', 'p', 'i', 'e', 'l', 's', 'w', 'e', 'i', 's', 'e']
Die letzte Ausgabe zeigt, daß die Liste »list_« anscheinend gar nicht richt sortiert wurde.
Was muß der Programmierer schreiben, um die Liste »list_« wirklich zu sortieren?
Übungsaufgaben
/ Übungsaufgabe
Sortieren Sie durch Eingabe von Python-Anweisungen die unten als Zeichenfolgenliteral angegebene Liste von Wörtern alphabetisch.
- Wortliste gegeben durch ein Zeichenfolgenliteral
"Subjekt Deklination Morphem Verb Valenz Partizip Infinitiv"
- gewünschtes Ergebnis
'Deklination Infinitiv Morphem Partizip Subjekt Valenz Verb'
/ Übungsaufgabe
Schreiben Sie eine Funktion ›sort‹, die eine als Zeichenfolge gegebene Liste leerzeichengetrennter Wörtern alphabetisch sortiert.
- gewünschtes Verhalten der Funktion
sort( "Dendrit Neurit Axon Soma Vakuole ATP Depolarisation Anion Tonoplast" )
'ATP Anion Axon Dendrit Depolarisation Neurit Soma Tonoplast Vakuole'
/ Übungsaufgabe *
Ermöglichen Sie es dem Bediener Ihres Programms, Zeilen einzugeben. Die Eingabe kann mit Strg-Z (beziehungsweise Strg-D unter Linux ) beendet werden. Die Zeilen sollen dann alphabetisch (lexikographisch) sortiert ausgegeben werden.
(Dabei wird nicht verlangt, daß die Zeilen in einer bestimmten Formatierung, wie „untereinander“, ausgegeben werden.)