Sortieren - Vorkenntnisse v 1.2 8/2002 SORTIEREN - Vorkenntnisse Listen Man kann Listen aus beliebigen Elementen aufbauen. Erkennbar sind sie an den eckigen Klammern. Beispiele: [8,2,4] oder ['acht','zwei','vier'] oder [8,'II',[1,1,1,1]]. Die Elemente werden durchnummeriert, wobei man mit dem Index 0 beginnt. Einzelne Elemente erhält man durch Angabe des Index. Teillisten (genauer: Kopien davon) erhält man durch Slices (Schnitte), die einen Bereich angeben. Liste[a:b] ergibt alle Elemente von Index a (inklusive) bis Index b (exklusive). Fehlt ein Index, wird der passende Randwert verwendet. Negative Indizes zählen von rückwärts. Liste[-1] ist das letzte Element. Die Tatsache, dass der Slice den oberen Indexwert nicht mehr enthält begründet sich darin, dass etwa L[:3]+L[3:] wiederum die gesamte Liste ergeben soll und die Festlegung auf halboffene Intervalle in ganz Python konsequent durchgehalten wird. In den folgenden Beispielen sei L=[7,2,8] Anweisung Ergebnis Beschreibung L [7,2,8] die Liste L[0] 7 das erste Element L[len(L)-1] 8 das letzte Element L[-1] 8 genau das gleiche [L[0]] [7] eine Liste bestehend aus dem ersten Element L[:1] [7] die Liste bis zum ersten Element (vor Index 1) L[1:] [2,8] die Liste ab Index 1, also dem zweiten Element L[:] [7,2,8] eine Kopie der Liste L L[1:-1] [2] die Liste ohne erstes und letztes Element [L[0]]+L[2:] [7,8] Liste aus erstem Element plus Listenrest ab dem drittem. Es wird also das zweite Element (Position 1) entfernt L[:1]+L[2:] [7,8] Teilliste aus erstem Element plus Listenrest ab dem dritten. (vor Index 1 und ab Index 3). Siehe oben. Wiederholungsanweisungen: 1.) REKURSION def zeig(x): print x if x >= 4: return zeig(x+1) def zeig(x): print x if x < 5: zeig(x+1) Wolfgang Urban, HIB Wien ein Aufruf zeig(1) zeigt die Zahlen von 1 bis 4 wie oben 1 Sortieren - Vorkenntnisse v 1.2 2.) WHILE x = 1 while x<5: print x zeigt die Zahlen von 1 bis 4 3.) FOR for x in [1,2,3,4]: print x zeigt die Zahlen von 1 bis 4 8/2002 ZAHLENBEREICHE (ganzzahlig): range(10) range(1,10) range(1,10,3) range(10,1,-1) ergibt eine Liste von 10 Zahlen, 0 bis 9. Grund: Offset 0 ist praktisch für Listen-Indizes ergibt Zahlen ab 1, kleiner als 10. Also [1,2,3,..,8,9] ergibt Zahlen ab 1, kleiner 10, in Dreierschritten. [1,4,7] ergibt Zahlen ab 10, abwärts, größer als 1. 1 wird NICHT erreicht. [10,9,8,...,3,2]. praktische Hilfsfunktionen: def swap(L,a,b): L[a],L(b) = L[b],L[a] swap tauscht die zwei Elemente an Position a und b der Liste L miteinander aus. def fullrange(von, bis, step=1): if step>0: return range(von,bis+1,step) else: return range(von,bis-1,step) fullrange funktioniert wie range, liefert aber auch den letzten Wert INKLUSIVE zurück. Das ist oft brauchbar, etwa in for x in fullrange(4,8): print x zeigt die Zahlen von 4 bis 8 Übungsbeispiele: 1.) eine Funktion soll das n-te Element einer Liste löschen 2.) eine Funktion soll das n-te Element einer Liste an die erste Stelle holen 3.) eine Liste soll umgedreht werden Beispiellösungen: 1.)def kill(L,n): return L[:n]+L[n+1:] 2.)def fetch(L,n): return [L[n]]+L[:n]+L[n+1:] 3.)def rev(L): if L==[]: return [] return L[-1:] + rev(L[:-1]) Wolfgang Urban, HIB Wien 2 Sortieren - Vorkenntnisse v 1.2 8/2002 Zusatz zu 3.) : untersuche die Ergebnisse interaktiv. Dreht unser reverse die Liste um, oder gibt es die verdrehte Liste zurück (L=....; rev(L); print L) ? Wie kann man dann die Liste wirklich umdrehen? (Antwort: Liste=rev(Liste)) Info: obige Funktionen sind übrigens bereits im Befehlsumfang von Python enthalten. Trotzdem ist es aber 1.) eine gute Übung und 2.) ganz lehrreich zu sehen, wie man komplexe Funktionen aus einfachen Befehlen zusammensetzen kann. Schließlich ist auch das größte und komplexeste Programm nur eine Aneinanderreihung einfacher Befehle.... Wolfgang Urban, HIB Wien 3