Jython

10. Listen und Tupels

In einer Liste oder einem Tupel kann man mehrere Werte speichern und auf diese Daten wieder zugreifen. Statt Werte in verschiedenen Variable a, b, c  einzeln abzuspeichern, stellt Python Datentypen zur Verfügung, die als Behälter für beliebig viele Daten verwendet werden. In anderen Programmiersprachen verwendet man dazu oft Arrays. Im Gegensatz zu Arrays haben Listen keine feste, vordefinierte Länge, d.h. ihre Länge wird der Anzahl gespeicherter Elemente automatisch angepasst (dynamische Datenstruktur).

Die Elemente einer Liste werden in eckigen Klammern geschrieben, z. B. eine Liste mit Farbnamen:

colors = ["red", "blue, "green"]

Die Werte eines Tupels werden mit runden Klammern geschrieben, z. B. x, y-Koordinaten eines Punkts:

pt = (10, 20)

Im Gegensatz zu Listen können die Werte von Tupels nachher nicht mehr verändert werden. Listen und Tupels lassen sich auch kombinieren, z.B. eine Liste mit Koordinaten von Eckpunkten einer Figur:

corners = [(2, 3), (5, 8), 7, 1)]]

 In den meisten der folgenden Beispiele könnte man statt Listen auch Tupels verwenden.

 

Beispiel 1: Auf die Elemente einer Liste zugreifen
Die Elemente einer Liste kann man mit einer for-Schleife der Reihe nach durchlaufen (iterieren). Im Beispiel besteht die Liste colors aus 7 Farbnamen.

Mit der for-Schleife for c in colors: geht man die Liste der Reihe nach durch und zeichnet mit dieser Farbe einen gefüllten Kreis, der während 600 Millisekunden angezeigt wird. Die Schleifenbefehle müssen eingerückt sein.

Auf die Elemente einer Liste kann man auch mit einem Index zugreifen. Das erste Element hat den Index 0, corners[3] ist also nicht etwa das dritte, sondern das vierte Element, im Beispiel also die Farbe "magenta".

# Gp10a.py
from gpanel import *

makeGPanel(-10, 10, -10, 10)
colors = ["red", "blue", "yellow", "magenta", "green", "cyan"]

for c in colors:
    setColor(c) 
    fillCircle(4)
    delay(600)
    
setColor(colors[3])
fillCircle(6)
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

for c in colors: Geht die Liste colors der Reihe nach durch
colors[3] Das vierte Element der Liste

 

Beispiel 2: Ein Polygon mit der Liste der Eckpunkte zeichnen

# Gp10b.py
from gpanel import *

makeGPanel(0, 10, 0, 10)
corners = [(4, 2), (1, 4), (3, 7), (6, 8), (7, 5), (5, 3)]
setColor("blue")

for pt in corners:
    fillPolygon(corners)
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

corners = [(4. 2)...] Man könnte auch ein Tupel verwenden
fillPolygon(corners) Die Funktion fillPolygon() erwartet als Parameter eine Liste mit Eckpunkten



Beispiel 3
: Die Elemente einer Liste mit Mausklicks erzeugen
Die Liste ist eine dynamische Datenstruktur, d.h. die Anzahl der Elemente kann sich während der Programmausführung ändern.

Im Beispiel ist die Liste corners zu Beginn leer. Mit einem linken Mausklick wird an der Position des Mausklicks ein kleiner Kreis gezeichnet und der Punkt an Ende der Liste hinzugefügt. Dazu verwendet man die Funktion append(). Bei einem rechten Mausklick wird mit dieser Liste ein gefülltes Polygon gezeichnet

# Gp10c.py
from gpanel import *

def onMousePressed(x, y):
    if isLeftMouseButton():
        pos(x, y)
        circle(0.1)
        corners.append((x, y))
    if isRightMouseButton():    
        fillPolygon(corners)

makeGPanel(0, 20, 0, 20, mousePressed = onMousePressed)
corners = []
setColor("magenta")
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

corners = [ ] Erzeugt eine leere Liste
corners.append((x, y)) Fügt den Punkt mit den Koordinaten (x, y) am Ende der Liste corners an



Beispiel 4
: Eine Punktmenge dynamisch mit Mausklicks festlegen und alle Verbindungslinien zeichnen
In diesem Beispiel ist es vorteilhaft, die Punkte mit p und q zu bezeichnen, wobei die Punkte mit einem Koordinatentupel (x. y) gegeben sind. Nach jedem Mausklick wird im Punkt p ein kleiner Kreis gezeichnet, danach wird p mit allen bereits bestehenden Punkten q der Liste corners verbunden und danach zu der Liste hinzugefügt.

# Gp10d.py
from gpanel import *

def onMousePressed(x, y):
    p = (x, y)
    pos(p)
    fillCircle(0.2)
    for q in corners:
        line(p, q)
    corners.append(p)
  
corners = []
makeGPanel(0, 20, 0, 20, mousePressed = onMousePressed)
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

p = (x, y): Punkt mit den Koordinaten x, y (Position des Mausklicks
for q in corners: line(p, q) Der neue Punkt wird mit allen bestehenden Punkten der Liste corners verbunden

 


Aufgaben: Serie 10

1)


Gib mit einem Inputdialog
v = inputInt("Gib eine Zahl ein")
10 Zahlen zwischen 1 und 10 ein und speichere sie in einer Liste. Schreibe die Liste mit dem Befehl print aus. Schreibe dann auch die aufsteigend sortierte Liste aus.

 


2)


toDo

 


3)



 

 

Zusatzerklärung:

Die wichtigsten Operationen mit Listen

 
 

li[i]

li.append(element)

li.insert(i, element)

li.index(element)

li.pop(i)

pop()

len(li)

del li[i]

li.reverse() 

li.sort() 

Auf Listenelement mit Index i zugreifen

Anfügen ans Ende

Einfügen an Stelle i (Element i rutscht nach rechts)

Sucht das erste Vorkommen und gibt dessen Index zurück

Entfernt das Element mit Index i und gibt es zurück

Entfernt das letzte Element und gibt es zurück

Gibt die Anzahl Listenelemente zurück

Entfernt das Element mit Index i

Kehrt die Liste um (letztes Element wird das erste)

Sortiert die Liste (Vergleich mit Standardverfahren)

 




Aufgaben: Serie 10

1)


Gib mit einem Inputdialog
v = inputInt("Gib eine Zahl ein")
10 Zahlen zwischen 1 und 10 ein und speichere sie in einer Liste. Schreibe die Liste mit dem Befehl print aus. Schreibe dann auch die aufsteigend sortierte Liste aus.

 


2)


toDo

 


3)