Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
gf_informatik:daten:processing:dictionaries [2022-06-13 06:58] – [Aufgabe 2: CSV in ein Dictionary einlesen] hof | gf_informatik:daten:processing:dictionaries [2024-06-10 12:30] (aktuell) – hof | ||
---|---|---|---|
Zeile 6: | Zeile 6: | ||
Wie wir wissen, können wir in einem (sortierten) Wörterbuch (Diktionär) effizient suchen: | Wie wir wissen, können wir in einem (sortierten) Wörterbuch (Diktionär) effizient suchen: | ||
- | * Der Suchbereich wird fortlaufend halbiert (s.a. Binäre Suche (s. [[gf_informatik: | + | * Der Suchbereich wird fortlaufend halbiert (s.a. Binäre Suche in [[gf_informatik: |
* Bei $n$ Einträgen benötigt die Suche nach einem Element nur $log_2(n)$ Zugriffe, also | * Bei $n$ Einträgen benötigt die Suche nach einem Element nur $log_2(n)$ Zugriffe, also | ||
* $10$ Zugriffe für $1024$ Elemente, | * $10$ Zugriffe für $1024$ Elemente, | ||
* $20$ Zugriffe für $1024\cdot1024 \approx 1Mio$, | * $20$ Zugriffe für $1024\cdot1024 \approx 1Mio$, | ||
* $30$ Zugriffe für $1024\cdot1024\cdot1024 \approx 1Mia$ | * $30$ Zugriffe für $1024\cdot1024\cdot1024 \approx 1Mia$ | ||
+ | |||
### Syntax | ### Syntax | ||
Zeile 32: | Zeile 33: | ||
plz = zip_codes[' | plz = zip_codes[' | ||
print(plz) | print(plz) | ||
- | |||
- | >>> | ||
</ | </ | ||
+ | |||
+ | 8590 | ||
Ein neues Element kann mit derselben Syntax angelegt werden - ist der Schlüssel bereits vorhanden, wird der Wert überschrieben: | Ein neues Element kann mit derselben Syntax angelegt werden - ist der Schlüssel bereits vorhanden, wird der Wert überschrieben: | ||
Zeile 41: | Zeile 42: | ||
zip_codes[' | zip_codes[' | ||
print(zip_codes) | print(zip_codes) | ||
- | |||
- | >>> | ||
</ | </ | ||
+ | |||
+ | {' | ||
Mit dem `in` Schlüsselwort kann herausgefunden werden, ob ein Schlüssel im Dictionary vorhanden ist: | Mit dem `in` Schlüsselwort kann herausgefunden werden, ob ein Schlüssel im Dictionary vorhanden ist: | ||
<code python> | <code python> | ||
print(' | print(' | ||
- | >>> True | + | </code> |
+ | True | ||
+ | |||
+ | <code python> | ||
print(' | print(' | ||
- | >>> | ||
</ | </ | ||
+ | |||
+ | False | ||
Wir können eine `for`-Schleife über die Keys in einem Dictionary schreiben: | Wir können eine `for`-Schleife über die Keys in einem Dictionary schreiben: | ||
Zeile 58: | Zeile 63: | ||
for town in zip_codes: | for town in zip_codes: | ||
print(town) | print(town) | ||
- | | ||
- | >>> | ||
- | >>> | ||
- | >>> | ||
</ | </ | ||
+ | |||
+ | Romanshorn | ||
+ | Egnach | ||
+ | Amriswil | ||
Möchten wir in der Schleife sowohl Key als auch Value haben, verwenden wir die `items()` Funktion: | Möchten wir in der Schleife sowohl Key als auch Value haben, verwenden wir die `items()` Funktion: | ||
Zeile 68: | Zeile 73: | ||
for town, plz in zip_codes.items(): | for town, plz in zip_codes.items(): | ||
print(plz, town) | print(plz, town) | ||
- | | ||
- | >>> | ||
- | >>> | ||
- | >>> | ||
</ | </ | ||
+ | |||
+ | 8591 Romanshorn | ||
+ | 9322 Egnach | ||
+ | 8580 Amriswil | ||
### Aufgabe 1: Dictionary Syntax | ### Aufgabe 1: Dictionary Syntax | ||
Zeile 83: | Zeile 88: | ||
Wir benötigen dafür zwei separate Dictionaries. | Wir benötigen dafür zwei separate Dictionaries. | ||
++++ | ++++ | ||
- | |||
### Aufgabe 2: CSV in ein Dictionary einlesen | ### Aufgabe 2: CSV in ein Dictionary einlesen | ||
- | Lies die Datei [[https:// | + | Lies die Datei [[https:// |
Die Daten sehen so aus: | Die Daten sehen so aus: | ||
Zeile 98: | Zeile 102: | ||
</ | </ | ||
- | Hinweis: | + | Hinweise: |
* Die PLZ steht zuerst, also an `values[0]` | * Die PLZ steht zuerst, also an `values[0]` | ||
* Der Ort ist an zweiter Stelle, also `values[1]` | * Der Ort ist an zweiter Stelle, also `values[1]` | ||
- | * Wir wollen ein umgekehrtes Dictionary von Ortsnamen zu PLZ. | + | * Wir wollen ein **umgekehrtes** Dictionary von Ortsnamen zu PLZ. |
- | * Ein Ortsnamen kann mehrere Postleitzahlen haben - wir möchten immer die erste behalten (also `1000` für Lausanne, nicht `1005`). | + | * Ein Ortsnamen kann mehrere Postleitzahlen haben - wir möchten immer die kleinste |
+ | <nodisp 2> | ||
++++Code| | ++++Code| | ||
<code python> | <code python> | ||
Zeile 121: | Zeile 126: | ||
</ | </ | ||
++++ | ++++ | ||
+ | </ | ||
+ | |||
### Aufgabe 3: Zwei Datasets kombinieren | ### Aufgabe 3: Zwei Datasets kombinieren | ||
- | Kombiniere die Daten zu den Schweizer Gemeinden mit den Postleitzahldaten: Was ist die niedrigste / höchste Postleitzahl im Kanton Thurgau? | + | Kombiniere die Daten zu den Schweizer Gemeinden |
++++Antwort: | ++++Antwort: | ||
- | * kleinste PLZ im Thurgau: 8253 Diessenhofen | + | * 4535 Kammersrohr 32 Einwohner |
- | * grösste PLZ im Thurgau: 9565 Bussnang | + | * 7550 Scuol 438.76 km² |
++++ | ++++ | ||
Zeile 134: | Zeile 141: | ||
++++Lösung: | ++++Lösung: | ||
<code python> | <code python> | ||
+ | smallest_town, | ||
+ | largest_town, | ||
zip_codes = load_zip_codes() | zip_codes = load_zip_codes() | ||
- | def find_min_tg_zips(): | + | print(zip_codes[smallest_town], |
- | with open(' | + | print(zip_codes[largest_town], largest_town, |
- | min_zip = 10000 | + | |
- | min_town = None | + | |
- | for line in towns: | + | |
- | cells = line.split(',' | + | |
- | town = cells[0] | + | |
- | canton = cells[1] | + | |
- | if canton == ' | + | |
- | zip = zip_codes[town] | + | |
- | if zip < min_zip: | + | |
- | min_zip = zip | + | |
- | min_town = town | + | |
- | return min_zip, min_town | + | |
- | </ | + | |
- | + | ||
- | Und äquivalent für das Maximum. | + | |
++++ | ++++ | ||
</ | </ | ||
+ | |||
+ | ### Mehr zu Dictionaries | ||
+ | |||
+ | Du willst mehr über Dictionaries wissen und selber eines programmieren? | ||
+ | |||
+ | ### Nächstes Kapitel | ||
+ | |||
+ | Weiter mit [[gf_informatik: |