Suchen in Listen und Hashtabellen - TU Bergakademie Freiberg
Suchen in Listen und Hashtabellen - TU Bergakademie Freiberg
Suchen in Listen und Hashtabellen - TU Bergakademie Freiberg
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