Listenverarbeitung in Python



Ähnliche Dokumente
Programmierung in Python

Stackmaschine; Speicheradressierung

Nachtrag: Vergleich der Implementierungen von Stack

Abstrakte Datentypen und deren Implementierung in Python

Auswertungsregeln für Listenfunktionen in Python: operationale Semantik

Einfügen immer nur am Kopf der Liste Löschen auch nur an einem Ende (2 Möglichkeiten!)

Stack. Queue. pop() liefert zuletzt auf den Stack gelegtes Element und löscht es push( X ) legt ein Element X auf den Stack

Algorithmik und Programmieren

3.1 Datenstrukturen und Typen in Haskell. Bisher haben wir nur die eingebauten Basisdatentypen wie Zahlen und Wahrheitswerte benutzt.

Funktionen in Python

WS2017/ Oktober 2017

Informatik I. Informatik I Iteratoren Generatoren Das Modul itertools. Iterierbare Objekte Iteratoren. Python-Interpreter

4.2 Daten und Datenstrukturen

Funktionale Programmierung mit Haskell

Grundlagen der Programmierung 2. Unendliche Listen und Ströme(B)

Algorithmische Abstraktion mit Python

4 Daten in Python. Primäres Ziel: Daten zu Containern zusammenfassen, insbesondere Vektoren etc., um vernünftige Beispiele rechnen zu können.

Wiederholung: Zusammenfassung Felder. Algorithmen und Datenstrukturen (für ET/IT) Definition Abstrakter Datentyp. Programm heute

Abstrakter Datentyp (ADT): Besteht aus einer Menge von Objekten, sowie Operationen, die auf diesen Objekten wirken.

Einführung in die Objektorientierte Programmierung Vorlesung 18: Lineare Datenstrukturen. Sebastian Küpper

Kapitel 12: Induktive

Programming 101. Carl Herrmann IPMB & DKFZ

Informatik I: Einführung in die Programmierung

Übung Algorithmen und Datenstrukturen

Counting - Sort [ [ ] [ [ ] 1. SS 2008 Datenstrukturen und Algorithmen Sortieren in linearer Zeit

Programmieren in Haskell Abstrakte Datentypen

Programmierung I Einführung in Python, Beyond the Basics

WS2018/ Oktober 2018

Informatik I: Einführung in die Programmierung 3. Werte, Typen, Variablen und Ausdrücke

16. Dynamische Datenstrukturen

Theoretische Informatik 1 WS 2007/2008. Prof. Dr. Rainer Lütticke

Java Referenzdatentypen genauer betrachtet

Datenstrukturen in Python

Programmieren in Haskell. Abstrakte Datentypen

Python Einführung. Monica Selva Soto. 24 März Mathematisches Institut

Ströme als unendliche Listen in Haskell

11. Elementare Datenstrukturen

1 Abstrakte Datentypen

Informatik II Übung 5

6. Funktionen, Parameterübergabe

1 Bedingungen und der Typ bool. Informatik I: Einführung in die Programmierung 5. Bedingungen, bedingte Ausführung und Schleifen. Vergleichsoperatoren

Verkettete Datenstrukturen: Listen

Programmierung 1 (Wintersemester 2015/16) Wiederholungstutorium Lösungsblatt 15 (Linearer Speicher, Listen, Bäume)

Praktikum Praktische Informatik. Python-Shell. Python. Programmieren in Python. Python-Programme. Eine Einführung

1 - Backus-Naur-Form. (a) Ableitung des Wortes /a*(a b)b/ aus der gegebenen BNF:

Einführung in die funktionale Programmierung

Funktionales Programmieren in Python

3. Übungsblatt zu Algorithmen I im SoSe 2017

Informatik II Sortieren

26 Hierarchisch strukturierte Daten

Lineare Datenstrukturen: Felder, Vektoren, Listen Modelle: math. Folge (a i ) i=1.. mit Basistyp T oder: [T]

8 Elementare Datenstrukturen

Übungsblatt 6: Softwareentwicklung I (WS 2006/07)

1 def Anweisung. 2 Argumentübergabe. 3 Lokale Variablen. 4 Default Argumente. 5 Aufruf mit Schlüsselwort. 6 Variable Argumente. Funktionen in Python

Funktionen in Python

Abstrakte Datentypen und Datenstrukturen

INFORMATIK FÜR BIOLOGEN

Gliederung. Algorithmen und Datenstrukturen I. Listen in Haskell: Listen in Haskell: Listen in Haskell. Datentyp Liste Strings Listenkomprehension

1. Die rekursive Datenstruktur Liste

Übung Algorithmen und Datenstrukturen

Advanced Programming in C

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

Programmieren I. Kapitel 13. Listen

Praxis der Programmierung

Einstieg in die Informatik mit Java

Selbsteinstufungstest Vorkurs Programmieren

Stacks, Queues & Bags. Datenstrukturen. Pushdown/Popup Stack. Ferd van Odenhoven. 19. September 2012

Transkript:

Listenverarbeitung in Python Datentypen für Sequenzen von Objekten: Tupel, Listen und Strings Tupel und Listen sind analog zu Haskells Tupel und Listen: (1, 2, 3) 3-Tupel aus den Zahlen 1,2,3, [1, 2, 3] Liste der Zahlen 1,2,3 Tupel haben feste Länge. Listen haben variable Länge P raktische Informatik 1, W S 2004/05, F olien P ython 3, (7. Januar2005) Seite 1

Listenfunktionen in Python Hauptfunktionalität der Listenfunktionen ist analog zu Haskell. Präfix-Schreibweise: Attribut-Schreibweise: I.a. Keine destruktiven Änderungen destruktive Änderungen möglich Hier ein Auszug aus einer Dokumentation zu Python. Operationen auf allen Arten von Folgen (Listen, Tupel, Strings) Aus Quick-Reference http://rgruet.free.fr/#quickref P raktische Informatik 1, W S 2004/05, F olien P ython 3, (7. Januar2005) Seite 2

Operation Resultat Bem. x in s True wenn ein Eintrag von s = x, sonst False x not in s False wenn ein Eintrag von s gleich x, sonst True s + t Konkatenation von s und t s n n Kopien von s aneinander gehängt s[i] i-es Element von s, Start mit 0 (1) s[i : j] Teilstück s ab i (incl.) bis j (excl.) (1), (2) len(s) Länge von s min(s) Kleinstes Element von s max(s) Größtes Element von s

Dokumentation: Bemerkungen (1) Wenn i oder j negativ ist, dann ist der Index relativ zum Ende des String, d.h. len(s)+i oder len(s)+j wird eingesetzt. Beachte, dass -0 = 0. (2) Das Teilstück von s von i bis j wird definiert als die Folge von Elementen mit Index k mit i <= k < j. Wenn i oder j größer als len(s) sind, nehme len(s). Wenn i weggelassen wurde, nehme len(s). Wenn i j, dann ist das Teilstück leer. P raktische Informatik 1, W S 2004/05, F olien P ython 3, (7. Januar2005) Seite 4

Operation auf Listen (in Attributschreibweise) Operation Resultat s[i] = x item i von s ersetzt durch x s[i : j] = t Unterliste s von i bis j ersetzt durch t del s[i : j] dasselbe wie s[i : j] = [] s.append(x) dasselbe wie s[len(s) : len(s)] = [x] s.extend(x) dasselbe wie s[len(s) : len(s)] = x s.count(x) Return: Anzahl der i mit s[i] == x s.index(x) Return: kleinstes i mit s[i] == x s.insert(i, x) dasselbe wie s[i : i] = [x] wenn i >= 0 s.remove(x) dasselbe wie del s[s.index(x)] s.pop([i]) dasselbe wie x = s[i]; del s[i]; return x s.reverse() Umdrehen von s in place s.sort([cmpf ct]) Sortiere s in place cmpfct: optional bei eigener nicht Standard cmpfct: return 1, 0, 1, wenn x < y, x = y, x > y sein soll P raktische Informatik 1, W S 2004/05, F olien P ython 3, (7. Januar2005) Seite 5

Seiteneffekte der Listen-Funktionen Python-Listen-Funktionen haben meist Seiteneffekte s.count(x) und s.index(x) haben keine Seiteneffekte. Die anderen Funktionen modfizieren die Liste direkt. P raktische Informatik 1, W S 2004/05, F olien P ython 3, (7. Januar2005) Seite 6

Weitere Listen-Funktionen In Präfix-Schreibweise: Operation Resultat map(f,s) Liste [f s[0], f s[1],... ] filter(p,s) Liste der Elemente mit p(s[i]) = True s + t Liste der Elemente aus s und t. reduce(op,s) s[0] op s[1] op... reduce(op,s,init) Dasselbe wie init op (reduce(op,s)) zip(s,t) Liste der Paare der Elemente von s,t. Rückgabewert i.a. analog zu dem der entsprechenden Haskellfunktion P raktische Informatik 1, W S 2004/05, F olien P ython 3, (7. Januar2005) Seite 7

Beispiele Wir geben zur Listenverarbeitung in Python einige Beispiele an: >>> range(20) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] >>> range(5,10) [5, 6, 7, 8, 9] >>> len(range(10)) 10 >>> len(range(1000000)) Traceback (most recent call last): File "<input>", line 1, in? MemoryError >>>len(xrange(1000000)) 1000000 >>> a = [ a, b, c ] P raktische Informatik 1, W S 2004/05, F olien P ython 3, (7. Januar2005) Seite 8

>>> a [ a, b, c ] >>> b = [3,4,5] >>> a.extend(b) >>> a [ a, b, c, 3, 4, 5] ## a ist modifiziert >>> b [3, 4, 5] >>> a.append(b) >>> a [ a, b, c, 3, 4, 5, [3, 4, 5]] >>> a.reverse() >>> a [[3, 4, 5], 5, 4, 3, c, b, a ] >>> b [3, 4, 5] ## b bleibt >>> b.reverse() >>> a [[5, 4, 3], 5, 4, 3, c, b, a ] ## a ist modifiziert! a.extend(b) verwendet eine Kopie der Liste b

mittels while oder for: Beispiel für for: >>> for i in range(1,11):... print(i)... 1 2 3... 8 9 10 >>> Schleifen in Python P raktische Informatik 1, W S 2004/05, F olien P ython 3, (7. Januar2005) Seite 10

Beispiele zu vordefinierten Listenfunktionen Listenfunktionen analog zu Haskells map, filter, und reduce map, filter, und foldl Folgende Funktion listcopy erzeugt eine Kopie einer Liste: def id(x): return x def listcopy(x): return map(id, x) def geradeq(n): return n%2 == 0 >>> filter(geradeq,range(20)) [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] >>> map(quadrat,range(1,10)) [1, 4, 9, 16, 25, 36, 49, 64, 81] >>> [1,2,3]+[11,12,13] [1, 2, 3, 11, 12, 13] P raktische Informatik 1, W S 2004/05, F olien P ython 3, (7. Januar2005) Seite 11

Beispiele zu vordefinierten Listenfunktionen (2) def add(x,y): return x+y >>> reduce(add,range(100)) 4950 def mal(x,y): return x*y def fakultaetred(n): return reduce(mal,range(1,n+1)) P raktische Informatik 1, W S 2004/05, F olien P ython 3, (7. Januar2005) Seite 12

Folgendes ist möglich Alias-Namens-Problematik Variablen, die in einem Aufruf f(t 1,..., t n ) nicht erwähnt werden, können nach der Auswertung dieses Aufrufs andere Werte haben. Alias-Problematik (Aliasing): tritt auf, wenn der gleiche Speicherbereich unter verschiedenen Namen referenziert wird (s.u.) Effekt: Der Wert einer Variablen x kann sich im Laufe der Programmbearbeitung verändern, ohne dass diese Variable in einem Befehl, der den Speicher verändert, vorkommt. Vorsicht bei xxy wurde im Aufruf nicht erwähnt, also ist es nach der Auswertung des Aufrufs f(z) nicht verändert?? P raktische Informatik 1, W S 2004/05, F olien P ython 3, (7. Januar2005) Seite 13

Alias-Namens-Problematik; Beispiel >>> a = [3,2,1] >>> b = a >>> a [3, 2, 1] >>> b [3, 2, 1] >>> a.sort() >>> a [1, 2, 3] >>> b [1, 2, 3] P raktische Informatik 1, W S 2004/05, F olien P ython 3, (7. Januar2005) Seite 14

Alias-Namens-Problematik; Beispiel >>> a = [3,4,5] >>> b = [ a, b, c ] >>> a.append(b) >>> a [3, 4, 5, [ a, b, c ]] >>> b [ a, b, c ] >>> b.reverse() ## hier passierts >>> a [3, 4, 5, [ c, b, a ]] >>> b [ c, b, a ] P raktische Informatik 1, W S 2004/05, F olien P ython 3, (7. Januar2005) Seite 15

Modell der internen Darstellung von Listen Notation und Vereinbarungen Pfeile bedeuten Bindungen repräsentiert ein Paar (von zwei impliziten Namen) Pfeil aus linker Zelle: Bindung des Listenelementes. Pfeil aus rechter Zelle: Bindung an die Restliste P raktische Informatik 1, W S 2004/05, F olien P ython 3, (7. Januar2005) Seite 16

Interne Darstellung von Listen Darstellung der Liste [1, 2, 3]: >>> a = [1,2,3] >>> b = a a b Nil 1 2 3 P raktische Informatik 1, W S 2004/05, F olien P ython 3, (7. Januar2005) Seite 17

Repräsentation von Listen >>> a = [1,2,3] >>> b = [4,5,6] >>> a.append(b) >>> a [1, 2, 3, [4, 5, 6]] >>> b.reverse() >>> a [1, 2, 3, [6, 5, 4]] >>> P raktische Informatik 1, W S 2004/05, F olien P ython 3, (7. Januar2005) Seite 18

Repräsentation von Listen (2) Bild des Speichers nach den obigen Befehlen: a Nil 1 2 3 b Nil 6 5 4 P raktische Informatik 1, W S 2004/05, F olien P ython 3, (7. Januar2005) Seite 19

Pythons Listendarstellung Ist intern optimiert: D.h. es gibt eigentlich keine Teillisten. Das entspricht folgendem Diagramm: >>> a = [1,2,3] a Nil 1 2 3 P raktische Informatik 1, W S 2004/05, F olien P ython 3, (7. Januar2005) Seite 20

Pythons Listendarstellung (2) >>> b = [4,5,6] >>> a.append(b) >>> a [1, 2, 3, [4, 5, 6]] >>> b.reverse() >>> a [1, 2, 3, [6, 5, 4]] a Nil b 1 2 3 Nil 6 5 4 P raktische Informatik 1, W S 2004/05, F olien P ython 3, (7. Januar2005) Seite 21

Stack in Python In Python leicht und effizient implementierbar: push b auf Stack a: a.insert(0,b) Benutzung der Listen von links: a.insert(0,b) a.pop(0) ##push(b) Benutzung der Listen von rechts: a.append(b) a.pop() Fehler bei pop() auf den leeren Stack P raktische Informatik 1, W S 2004/05, F olien P ython 3, (7. Januar2005) Seite 22

Beispiele: Stack in Python Verwendung eines Umgebungsstacks zur Auswertung von (Python-)Ausdrücken. Umdrehen einer Liste (siehe Haskell-Kapitel) P raktische Informatik 1, W S 2004/05, F olien P ython 3, (7. Januar2005) Seite 23

Schlange, Queue Reihenfolge: first-in; first out (fifo). Effiziente Implementierung von links oder von rechts: a.insert(0,b) a.pop() a.append(b) a.pop(0) Links b in die Liste a einfügen Letztes Element entfernen Rechts b in die Liste a einfügen Erstes Element entfernen P raktische Informatik 1, W S 2004/05, F olien P ython 3, (7. Januar2005) Seite 24