30.01.2014 Aufrufe

Suchen in Listen und Hashtabellen - TU Bergakademie Freiberg

Suchen in Listen und Hashtabellen - TU Bergakademie Freiberg

Suchen in Listen und Hashtabellen - TU Bergakademie Freiberg

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

Kapitel 12:<br />

<strong>Suchen</strong> <strong>in</strong> <strong>Listen</strong> <strong>und</strong> <strong>Hashtabellen</strong><br />

E<strong>in</strong>führung <strong>in</strong> die Informatik<br />

W<strong>in</strong>tersemester 2007/08<br />

Prof. Bernhard Jung<br />

Übersicht<br />

• E<strong>in</strong>leitung<br />

• L<strong>in</strong>eare Suche<br />

• B<strong>in</strong>äre Suche (<strong>in</strong> sortierten <strong>Listen</strong>)<br />

• Hashverfahren<br />

• Python Dictionaries – e<strong>in</strong>e Implementierung von <strong>Hashtabellen</strong><br />

Literatur<br />

• G. Saake & K.-U. Sattler. Algorithmen <strong>und</strong> Datenstrukturen. dPunkt Lehrbuch. 2006.<br />

• R. Sedgewick. Algorithmen. 2. Auflage. Addison Wesley. 2002.<br />

• W. Küchl<strong>in</strong>, A. Weber: E<strong>in</strong>führung <strong>in</strong> die Informatik.<br />

• Donald Knuth. The Art of Computer Programm<strong>in</strong>g, Volume 3: Sort<strong>in</strong>g and Search<strong>in</strong>g,<br />

Third Edition. Addison-Wesley, 1997.<br />

• Algorithmus der Woche. http://www-i1.<strong>in</strong>formatik.rwth-aachen.de/~algorithmus/<br />

Prof. B. Jung E<strong>in</strong>führung <strong>in</strong> die Informatik, WS 2007/08 <strong>TU</strong> <strong>Bergakademie</strong> <strong>Freiberg</strong><br />

1


<strong>Suchen</strong> - Problemstellung<br />

• Gegeben ist e<strong>in</strong>e Menge von<br />

n Datensätzen<br />

z.B. n = 1000, 10000, 100000, …<br />

• Jeder Datensatz kann i.a. mehrere<br />

Attribute umfassen<br />

dann wird nach dem Datensatz mit e<strong>in</strong>em<br />

bestimmten Attribut, dem Schlüssel gesucht<br />

Schlüssel wird im folgenden als e<strong>in</strong>deutig<br />

angenommen<br />

d.h. Suche liefert entweder e<strong>in</strong> oder ke<strong>in</strong><br />

Ergebnis (erfolgreicher/erfolgloser Fall)<br />

• Schlüssel kann Zahl, oder auch<br />

Zeichenkette se<strong>in</strong><br />

• Beispiele<br />

Suche E<strong>in</strong>trag <strong>in</strong> Telefonbuch<br />

Suche CD oder Buch <strong>in</strong> Regal<br />

Persnr Name Rang Raum<br />

-----------------------------------------<br />

2125 Sokrates C4 226<br />

2126 Russel C4 232<br />

2127 Kopernikus C3 310<br />

2133 Popper C3 52<br />

2134 August<strong>in</strong>us C3 309<br />

2136 Curie C4 36<br />

2137 Kant C4 7<br />

Beispiel für Mitarbeiter-Datenbank<br />

e<strong>in</strong>er Universität.<br />

Beispiel-Suchaufgabe:<br />

Suche den Mitarbeiter mit Persnr<br />

(Schlüssel) = 2136<br />

CD-Sammlung<br />

Prof. B. Jung E<strong>in</strong>führung <strong>in</strong> die Informatik, WS 2007/08 <strong>TU</strong> <strong>Bergakademie</strong> <strong>Freiberg</strong><br />

<strong>Suchen</strong> <strong>in</strong> Sequenzen<br />

–L<strong>in</strong>eare Suche<br />

• Problem<br />

Gegeben: Liste L mit n Werten, Suchwert k<br />

• (Liste kann sortiert se<strong>in</strong>, muss aber nicht)<br />

Gesucht: Index i des Elements von L, so dass L[i] == k;<br />

falls k nicht <strong>in</strong> L enthalten: Rückgabe von NO_KEY<br />

• Vorgehensweise<br />

durchsuche Liste von vorne nach h<strong>in</strong>ten, bis Element gef<strong>und</strong>en<br />

NO_KEY = -1<br />

def l<strong>in</strong>Search(liste, k):<br />

for i <strong>in</strong> range(len(liste)):<br />

if liste[i] == k: return i<br />

return NO_KEY<br />

>>> l<strong>in</strong>Search([2,1,4,6,5,9,6,3], 6)<br />

3<br />

>>> l<strong>in</strong>Search(['a','x','y','zz','cc','c'], 'c')<br />

5<br />

>>> l<strong>in</strong>Search([1,2,3],4)<br />

Prof. -1 B. Jung E<strong>in</strong>führung <strong>in</strong> die Informatik, WS 2007/08 <strong>TU</strong> <strong>Bergakademie</strong> <strong>Freiberg</strong><br />

2


<strong>Suchen</strong> <strong>in</strong> Sequenzen – L<strong>in</strong>eare Suche<br />

• Analyse der Zeitkomplexität<br />

Sequenz wird von vorne nach h<strong>in</strong>ten durchsucht, bis Element gef<strong>und</strong>en<br />

Erfolgreiche Suche:<br />

<br />

• bester Fall: gesuchter Schlüssel ist erster <strong>in</strong> Liste 1 Vergleich<br />

• schlechtester Fall: gesuchter Schlüssel ist letzter <strong>in</strong> Liste n Vergleiche<br />

• durchschnittlicher Fall: gesuchter Schlüssel ist <strong>in</strong> Mitte (n+1)/2 Vergleiche<br />

Erfolglose Suche:<br />

• alle Elemente der Liste werden gestestet n Vergleiche<br />

Anzahl Vergleiche<br />

Bester Fall<br />

Schlechtester Fall<br />

Durchschnittl. Fall (erfolgreiche Suche)<br />

Durchschnittl. Fall (erfolglose Suche)<br />

1 – "proportional zu 1"<br />

n – "proportional zu n"<br />

(n+1)/2 – "proportional zu n"<br />

n – "proportional zu n"<br />

Zeitkomplexität gilt auch, falls Sequenz sortiert ist!<br />

Für sortierte Sequenzen gibt es aber bessere Verfahren …<br />

Prof. B. Jung E<strong>in</strong>führung <strong>in</strong> die Informatik, WS 2007/08 <strong>TU</strong> <strong>Bergakademie</strong> <strong>Freiberg</strong><br />

<strong>Suchen</strong> <strong>in</strong> sortierten Sequenzen – B<strong>in</strong>äre Suche<br />

• Problem (wie bei Suche <strong>in</strong> unsortierten Sequenzen)<br />

Gegeben: Sortierte Liste L mit n Werten, Suchwert k<br />

Gesucht: Index i des Elements von L, so dass L[i] == k;<br />

falls k nicht <strong>in</strong> L enthalten: Rückgabe von NO_KEY<br />

• Motivation: Suche durch "Intervallhalbieren"<br />

Suche <strong>in</strong> Telefonbuch z.B. durch sukzessives Halbieren des Suchbereichs:<br />

• Schlage Telefonbuch <strong>in</strong> Mitte auf<br />

• Überprüfe, <strong>in</strong> welcher Hälfte sich der E<strong>in</strong>trag bef<strong>in</strong>det (halbiert Suchbereich)<br />

• Wiederhole mit dieser Hälfte, bis Seite gef<strong>und</strong>en<br />

• Vorgehensweise<br />

überprüfe Element <strong>in</strong> Mitte der Liste (Index m = len(L) / 2)<br />

falls L[m] == k gef<strong>und</strong>en<br />

falls L[m] < k suche <strong>in</strong> erster Hälfte der Liste, d.h. L[0:m]<br />

falls l[m] > k suche <strong>in</strong> zweiter Hälfte der Liste, d.h. L[m+1:n]<br />

Suche erfolglos, falls Suchbereich leer slice-Notation<br />

>>> l = [1,2,3,4]<br />

>>> l[0:2], l[3:4]<br />

Prof. B. Jung E<strong>in</strong>führung <strong>in</strong> die Informatik, WS 2007/08<br />

([1, 2], [4])<br />

<strong>TU</strong> <strong>Bergakademie</strong> <strong>Freiberg</strong><br />

3


<strong>Suchen</strong> <strong>in</strong> sortierten Sequenzen – B<strong>in</strong>äre Suche<br />

def b<strong>in</strong>Search(liste, key):<br />

l = 0<br />

# left end<br />

r = len(liste) - 1 # right end<br />

while l


<strong>Suchen</strong> <strong>in</strong> sortierten Sequenzen – B<strong>in</strong>äre Suche<br />

Analyse<br />

• Wie lange muss man höchstens suchen?<br />

Gegeben: Liste mit n E<strong>in</strong>trägen<br />

Gesucht: Anzahl der höchstens benötigten Suchschritte (Vergleiche)<br />

• Anders herum:<br />

Gegeben: k Suchschritte (Vergleiche)<br />

Gesucht: Anzahl der E<strong>in</strong>träge, die durchsucht werden können<br />

• mit 1 Vergleich: 2 E<strong>in</strong>träge<br />

• mit 2 Vergleichen: 4 E<strong>in</strong>träge<br />

• mit 3 Vergleichen: 8 E<strong>in</strong>träge<br />

• …<br />

• mit k Vergleiche: 2 k E<strong>in</strong>träge<br />

• Nochmal: Wie lange muss man höchstens suchen?<br />

<br />

Suche <strong>in</strong> Liste der Länge n benötigt höchstens log 2<br />

n Vergleiche<br />

Prof. B. Jung E<strong>in</strong>führung <strong>in</strong> die Informatik, WS 2007/08 <strong>TU</strong> <strong>Bergakademie</strong> <strong>Freiberg</strong><br />

<strong>Suchen</strong> <strong>in</strong> sortierten Sequenzen – B<strong>in</strong>äre Suche<br />

Analyse<br />

Anzahl Vergleiche<br />

Bester Fall<br />

Schlechtester Fall<br />

Durchschnittl. Fall (erfolgreiche Suche)<br />

Durchschnittl. Fall (erfolglose Suche)<br />

1 – "proportional zu 1"<br />

≈ log n – "proportional zu log n"<br />

≈ log n – "proportional zu log n"<br />

≈ log n – "proportional zu log n"<br />

Prof. B. Jung E<strong>in</strong>führung <strong>in</strong> die Informatik, WS 2007/08 <strong>TU</strong> <strong>Bergakademie</strong> <strong>Freiberg</strong><br />

5


<strong>Suchen</strong> <strong>in</strong> sortierten Sequenzen<br />

Vergleich l<strong>in</strong>eare <strong>und</strong> b<strong>in</strong>äre Suche<br />

• l<strong>in</strong>eare Suche<br />

Maximale Anzahl der Vergleiche: n<br />

Durchschnittliche Anzahl der Vergleiche: n/2<br />

funktioniert auch bei unsortierten <strong>Listen</strong><br />

• B<strong>in</strong>äre Suche<br />

Maximale <strong>und</strong> durchschnittliche Anzahl Vergleiche: ca. log 2 n<br />

Verfahren<br />

10<br />

10 2<br />

10 3<br />

10 4<br />

L<strong>in</strong>eare Suche (n/2)<br />

≈ 5<br />

≈ 50<br />

≈ 500<br />

≈ 5000<br />

B<strong>in</strong>äre Suche (log 2 n)<br />

≈ 3.3<br />

≈ 6.6<br />

≈ 9.9<br />

≈ 13.3<br />

durchschnittliche Anzahl Vergleiche der Suchverfahren<br />

Prof. B. Jung E<strong>in</strong>führung <strong>in</strong> die Informatik, WS 2007/08 <strong>TU</strong> <strong>Bergakademie</strong> <strong>Freiberg</strong><br />

Hashverfahren<br />

• Anwendung von Hash<strong>in</strong>g: Verfahren für dynamisch veränderliche<br />

Menge von Objekten mit effizienten Gr<strong>und</strong>operationen (sog.<br />

Wörterbuchoperationen)<br />

<strong>Suchen</strong>, E<strong>in</strong>fügen, Löschen<br />

• Vermeidet Probleme bisheriger Verfahren:<br />

l<strong>in</strong>eare Suche: ca. n/2 Vergleiche<br />

b<strong>in</strong>äre Suche: ca. log 2 n Vergleiche<br />

stattdessen: Suche <strong>in</strong> konstanter Zeit möglich (durchschnittlicher Fall)<br />

• Möglicher Nachteil von <strong>Hashtabellen</strong><br />

Reihenfolge der Elemente nicht def<strong>in</strong>iert<br />

damit auch wird auch Sortieren nicht unterstützt<br />

Prof. B. Jung E<strong>in</strong>führung <strong>in</strong> die Informatik, WS 2007/08 <strong>TU</strong> <strong>Bergakademie</strong> <strong>Freiberg</strong><br />

6


E<strong>in</strong>faches Beispiel für Hashtabelle<br />

Index<br />

0<br />

1<br />

2<br />

3<br />

4<br />

5<br />

6<br />

7<br />

8<br />

9<br />

E<strong>in</strong>trag<br />

42<br />

96<br />

119<br />

e<strong>in</strong>fache Hashtabelle,<br />

Hashfunktion: h(i) = i mod 10<br />

Gr<strong>und</strong>pr<strong>in</strong>zip von Hashverfahren<br />

• Datensätze werden <strong>in</strong> e<strong>in</strong>em Feld/Array<br />

mit Indexwerten 0 .. n-1 gespeichert<br />

Positionen auch als "Buckets" bezeichnet<br />

• E<strong>in</strong>e Hashfunktion h bestimmt für e<strong>in</strong><br />

Element e den Index h(e)<br />

• Die Hashfunktion h sollte die Elemente<br />

möglichst "gut", d.h. mit möglichst wenigen<br />

Kollisionen auf die Buckets verteilen<br />

Kollision liegt vor, wenn Hashfunktion<br />

mehrere Element auf denselben Bucket<br />

abbildet<br />

• verschiedene Varianten des<br />

Hashverfahrens unterscheiden sich bei der<br />

Behandlung von Kollisionen<br />

Prof. B. Jung E<strong>in</strong>führung <strong>in</strong> die Informatik, WS 2007/08 <strong>TU</strong> <strong>Bergakademie</strong> <strong>Freiberg</strong><br />

Hashfunktion<br />

• Hashfunktion bildet "Objekte" auf ganze Zahlen ab<br />

z.B. Integer, Zeichenketten<br />

• Hashfunktion für Integer<br />

h(i) = i mod N, mit N Größe der Hashtabelle<br />

N sollte (große) Primzahl se<strong>in</strong> <strong>und</strong> nicht zu nahe an Zweierpotenz liegen<br />

• um e<strong>in</strong>e möglichste gute Gleichverteilung zu erreichen, d.h.<br />

M<strong>in</strong>imierung von Kollisionen<br />

• Hashfunktionen für andere Datentypen<br />

float: z.B. (Mantisse+Exponent) mod N<br />

str<strong>in</strong>g: Verwendung von Ascii/Unicode-Wert<br />

• Hashfunktion sollte immer effizient zu berechnen se<strong>in</strong> (konstante Zeit)!<br />

Prof. B. Jung E<strong>in</strong>führung <strong>in</strong> die Informatik, WS 2007/08 <strong>TU</strong> <strong>Bergakademie</strong> <strong>Freiberg</strong><br />

7


Hashtabelle: Veranschaulichung<br />

U<br />

(Universum der Schlüssel)<br />

K<br />

(Aktuelle Schlüssel)<br />

h(k 4 )<br />

k 4<br />

k 1<br />

h(k 1 )<br />

h(k 2 )=h(k 5 )<br />

k 2<br />

k 5<br />

k 3<br />

h(k 3 )<br />

Durch die Hashfunktion h werden Schlüssel (von Datensätzen) auf Indices der Hashtabelle<br />

abgebildet. Im Beispiel kommt es zu e<strong>in</strong>er Kollision zwischen von Hashwerten von k 2<br />

<strong>und</strong> k 5<br />

Prof. B. Jung E<strong>in</strong>führung <strong>in</strong> die Informatik, WS 2007/08 <strong>TU</strong> <strong>Bergakademie</strong> <strong>Freiberg</strong><br />

Strategien zur Behandlung von Kollisionen:<br />

Direkte Verkettung<br />

K<br />

(Aktuelle Schlüssel)<br />

k 2<br />

k 5<br />

k 2<br />

k 3<br />

k 3<br />

k 5<br />

• Beim Verfahren der direkten Verkettung werden Kollisionen aufgelöst,<br />

<strong>in</strong>dem jeder Tabellenplatz e<strong>in</strong>en Zeiger auf e<strong>in</strong>e verkettete Liste enthält<br />

• Zeitkomplexität für Suche, n = Anzahl der aktuellen Schlüssel:<br />

schlechtester Fall: Proportional zu n<br />

(wenn alle Schlüssel auf selben Tabellenplatz abgebildet werden)<br />

bester Fall: konstante Zeit (wenn ke<strong>in</strong>e Kollisionen vorkommen)<br />

Prof. B. Jung E<strong>in</strong>führung <strong>in</strong> die Informatik, WS 2007/08 <strong>TU</strong> <strong>Bergakademie</strong> <strong>Freiberg</strong><br />

8


Strategien zur Behandlung von Kollisionen:<br />

Open Hash<strong>in</strong>g<br />

• Beim Open Hash<strong>in</strong>g werden alle E<strong>in</strong>träge <strong>in</strong> der Hashtabelle<br />

gehalten<br />

• d.h. es können maximal m Elemente gespeichert werden, wobei m<br />

Größe der Hashtabelle<br />

• Ist e<strong>in</strong>e Komponente der Tabelle schon belegt (Kollision), so wird e<strong>in</strong><br />

freier Platz für e<strong>in</strong>en weiteren E<strong>in</strong>trag gesucht<br />

verschiedene Strategien, wo neuer freier E<strong>in</strong>trag gesucht wird<br />

z.B. l<strong>in</strong>eare Verschiebung: nächster freier E<strong>in</strong>trag<br />

z.B. double Hash<strong>in</strong>g: E<strong>in</strong>satz e<strong>in</strong>er zweiten Hash-Funktion<br />

Prof. B. Jung E<strong>in</strong>führung <strong>in</strong> die Informatik, WS 2007/08 <strong>TU</strong> <strong>Bergakademie</strong> <strong>Freiberg</strong><br />

Strategien zur Behandlung von Kollisionen:<br />

Open Hash<strong>in</strong>g mit l<strong>in</strong>earer Verschiebung<br />

K<br />

(Aktuelle Schlüssel)<br />

k 1<br />

k 2<br />

k 3<br />

• Falls h(k) bereits durch e<strong>in</strong>en anderen Schlüssel besetzt ist, wird<br />

versucht, k <strong>in</strong> den Adressen h(k) + 1, h(k) + 2, . . . unterzubr<strong>in</strong>gen<br />

• Präziser gesagt, wird folgende Hashfunktion verwendet:<br />

h'(k, i) = ( h(k) + i ) mod m mit i = 0, 1, 2, . . . ,m − 1.<br />

Prof. B. Jung E<strong>in</strong>führung <strong>in</strong> die Informatik, WS 2007/08 <strong>TU</strong> <strong>Bergakademie</strong> <strong>Freiberg</strong><br />

9


Strategien zur Behandlung von Kollisionen:<br />

Open Hash<strong>in</strong>g mit l<strong>in</strong>earer Verschiebung<br />

h(k) = k mod 5<br />

falls h(k) belegt, probiere (h(k) + 1) mod 5<br />

falls auch belegt, probiere (h(k) + 2) mod 5<br />

…<br />

Bem.: Beim Open Hash<strong>in</strong>g können maximal N Elemente gespeichert werden,<br />

mit N Größe der Hashtabelle<br />

Prof. B. Jung E<strong>in</strong>führung <strong>in</strong> die Informatik, WS 2007/08 <strong>TU</strong> <strong>Bergakademie</strong> <strong>Freiberg</strong><br />

Strategien zur Behandlung von Kollisionen:<br />

Open Hash<strong>in</strong>g mit Double Hash<strong>in</strong>g<br />

K<br />

(Aktuelle Schlüssel)<br />

k 1<br />

k 2<br />

k 3<br />

• Im Fall e<strong>in</strong>er Kollision wird die Verschiebung durch e<strong>in</strong>e zweite<br />

Hashfunktion erreicht<br />

• Präziser gesagt, wird folgende Hashfunktion verwendet:<br />

h'(k, i) = ( h 1 (k) + i • h 2 (k) ) mod m mit i = 0, 1, 2, . . . ,m − 1.<br />

Prof. B. Jung E<strong>in</strong>führung <strong>in</strong> die Informatik, WS 2007/08 <strong>TU</strong> <strong>Bergakademie</strong> <strong>Freiberg</strong><br />

10


Vergleich zum Open Hash<strong>in</strong>g: Typische Füllmuster bei<br />

l<strong>in</strong>earer Verschiebung <strong>und</strong> Double Hash<strong>in</strong>g<br />

Typisches Füllmuster bei l<strong>in</strong>earer Verschiebung<br />

Typisches Füllmuster bei double Hash<strong>in</strong>g<br />

Beobachtung: Kürzere Ketten bei double Hash<strong>in</strong>g<br />

im Durchschnitt etwas weniger Vergleiche notwendig bei vollen <strong>Hashtabellen</strong><br />

Prof. B. Jung E<strong>in</strong>führung <strong>in</strong> die Informatik, WS 2007/08 <strong>TU</strong> <strong>Bergakademie</strong> <strong>Freiberg</strong><br />

Hash<strong>in</strong>g - Ladefaktor<br />

• Ladefaktor für e<strong>in</strong>e Hashtabelle T ist def<strong>in</strong>iert als n/m, wobei n die Anzahl<br />

der gespeicherten Schlüssel <strong>und</strong> m die Kapazität der Tabelle ist<br />

• Theoretische Untersuchungen <strong>und</strong> praktische Messungen haben ergeben,<br />

dass der Ladefaktor e<strong>in</strong>er Hashtabelle den Wert 0.8 nicht überschreiten<br />

sollte (d.h. die Hashtabelle darf höchstens zu 80% gefüllt werden)<br />

• Ist der Ladefaktor 0.8, so treten beim <strong>Suchen</strong> im Durchschnitt weniger als 3<br />

Kollisionen auf (double hash<strong>in</strong>g)<br />

durchschnittlicher Fall: Suche <strong>in</strong> konstanter Zeit<br />

• Bei e<strong>in</strong>em höheren Ladefaktor steigt die Zahl der Kollisionen rasch an<br />

steigt Ladefaktor auf > 0.8 an, dann sollte Tabellengröße erhöht werden<br />

Prof. B. Jung E<strong>in</strong>führung <strong>in</strong> die Informatik, WS 2007/08 <strong>TU</strong> <strong>Bergakademie</strong> <strong>Freiberg</strong><br />

11


<strong>Suchen</strong> <strong>in</strong> sortierten Sequenzen <strong>und</strong> <strong>Hashtabellen</strong><br />

Vergleich l<strong>in</strong>eare <strong>und</strong> b<strong>in</strong>äre Suche<br />

Verfahren<br />

10<br />

10 2<br />

10 3<br />

10 5<br />

10 4 ≈ 16.6<br />

L<strong>in</strong>eare Suche (n/2)<br />

≈ 5<br />

≈ 50<br />

≈ 500<br />

≈ 5000<br />

≈ 50000<br />

B<strong>in</strong>äre Suche (log 2 n)<br />

≈ 3.3<br />

≈ 6.6<br />

≈ 9.9<br />

≈ 13.3<br />

Hashtabelle mit Ladefaktor ≤ 0.8<br />

(≤ 3)<br />

≤ 3<br />

≤ 3<br />

≤ 3<br />

≤ 3<br />

≤ 3<br />

durchschnittliche Anzahl Vergleiche der Suchverfahren<br />

Prof. B. Jung E<strong>in</strong>führung <strong>in</strong> die Informatik, WS 2007/08 <strong>TU</strong> <strong>Bergakademie</strong> <strong>Freiberg</strong><br />

Python Dictionaries<br />

• Kollektion von Schlüssel-Wert Paaren (Assoziatives Array)<br />

Zugriff über Schlüssel<br />

implementiert als Hashtabelle<br />

>>> tel = {'jack': 4098, 'sape': 4139}<br />

>>> type(tel)<br />

Erzeugung e<strong>in</strong>es Dictionary<br />

<br />

>>> tel['guido'] = 4127<br />

H<strong>in</strong>zufügen e<strong>in</strong>es Elements<br />

>>> pr<strong>in</strong>t tel<br />

{'sape': 4139, 'guido': 4127, 'jack': 4098}<br />

>>> tel['jack']<br />

4098<br />

>>> del tel['sape']<br />

Löschen e<strong>in</strong>es Elements<br />

>>> pr<strong>in</strong>t tel<br />

{'guido': 4127, 'jack': 4098}<br />

>>> tel.keys()<br />

alle Schlüssel als Liste<br />

['guido', 'jack']<br />

>>> tel.has_key('guido')<br />

Test, ob Schlüssel <strong>in</strong><br />

True<br />

Liste enthalten ist<br />

>>> 'guido' <strong>in</strong> tel<br />

True Prof. B. Jung E<strong>in</strong>führung <strong>in</strong> die Informatik, WS 2007/08 <strong>TU</strong> <strong>Bergakademie</strong> <strong>Freiberg</strong><br />

12


Python Dictionaries<br />

• eigentlich ke<strong>in</strong>e Reihenfolge <strong>in</strong> Dictionaries def<strong>in</strong>iert<br />

• trotzdem kann über Elemente iteriert werden:<br />

iteritems(): Iteration über Tupel (key, value)<br />

iterkeys(): Iteration über Schlüssel<br />

itervalues(): Iteration über Werte<br />

• siehe auch: help(dict)<br />

>>> knights = {'gallahad': 'the pure', 'rob<strong>in</strong>': 'the brave'}<br />

>>> for k, v <strong>in</strong> knights.iteritems():<br />

pr<strong>in</strong>t k, v<br />

gallahad the pure<br />

rob<strong>in</strong> the brave<br />

>>> for k <strong>in</strong> knights.iterkeys():<br />

pr<strong>in</strong>t k<br />

gallahad<br />

rob<strong>in</strong><br />

Prof. B. Jung E<strong>in</strong>führung <strong>in</strong> die Informatik, WS 2007/08 <strong>TU</strong> <strong>Bergakademie</strong> <strong>Freiberg</strong><br />

13

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!