Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

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] hofgf_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:suchen_und_sortieren]])+  * Der Suchbereich wird fortlaufend halbiert (s.a. Binäre Suche in [[gf_informatik:suchen_und_sortieren_2023]])
   * 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['Romanshorn'] plz = zip_codes['Romanshorn']
 print(plz) print(plz)
- 
->>> 8590 
 </code> </code>
 +
 +  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['Romanshorn'] = 8591  # Überschreibt den bestehenden Eintrag für Romanshorn zip_codes['Romanshorn'] = 8591  # Überschreibt den bestehenden Eintrag für Romanshorn
 print(zip_codes) print(zip_codes)
- 
->>> {'Romanshorn': 8591, 'Egnach': 9322, 'Amriswil': 8580} 
 </code> </code>
 +
 +  {'Romanshorn': 8591, 'Egnach': 9322, 'Amriswil': 8580}
  
 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('Romanshorn' in zip_codes) print('Romanshorn' in zip_codes)
->>> True+</code>
  
 +  True
 +
 +<code python>
 print('St. Gallen' in zip_codes) print('St. Gallen' in zip_codes)
->>> False 
 </code> </code>
 +
 +  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 
 </code> </code>
 +
 +  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 
 </code> </code>
 +
 +  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://kantonsschuleromanshorn.sharepoint.com/:x:/s/FSInformatik/EfL62vFg8xxMvs54mdfoR_cBxNp-4ekpI6EpHUuaCmz_9A?e=plZlJU&download=1|plz.csv]] ein und erstelle daraus ein Dictionary von Ortsnamen zu Postleitzahl.+Lies die Datei [[https://kantonsschuleromanshorn.sharepoint.com/:f:/s/FSInformatik/Ek-Hi_stH2RMjDa-wQN9jekBMeF_YD6rvhmibDlNglGWxw?e=Y3AX65|plz.csv]] ein und erstelle daraus ein Dictionary von Ortsnamen zu Postleitzahl.
  
 Die Daten sehen so aus: Die Daten sehen so aus:
Zeile 98: Zeile 102:
 </code> </code>
  
-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 behalten (also `1000` für Lausanne, nicht `1005`).
  
 +<nodisp 2>
 ++++Code| ++++Code|
 <code python> <code python>
Zeile 121: Zeile 126:
 </code> </code>
 ++++ ++++
 +</nodisp>
 +
  
 ### 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 (aus [[gf_informatik:daten:processing#aufgabe_6|Data Processing A6]]) mit den Postleitzahl-Daten: Was ist PLZ der kleinsten Schweizer Gemeinde? Der flächenmässig grössten Gemeinde?
  
 ++++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, smallest_pop = find_smallest_population()
 +largest_town, largest_area = find_largest_area()
 zip_codes = load_zip_codes() zip_codes = load_zip_codes()
-def find_min_tg_zips(): +print(zip_codes[smallest_town], smallest_town, smallest_pop, "Einwohner"
-    with open('gemeinden.csv') as towns: +print(zip_codes[largest_town], largest_town, largest_area, "km²")</code>
-        min_zip = 10000 +
-        min_town = None +
-        for line in towns: +
-            cells = line.split(','+
-            town = cells[0] +
-            canton = cells[1] +
-            if canton == 'TG' and town in zip_codes: +
-                zip = zip_codes[town] +
-                if zip < min_zip: +
-                    min_zip = zip +
-                    min_town = town +
-        return min_zipmin_town +
-</code> +
- +
-Und äquivalent für das Maximum.+
 ++++ ++++
 </nodisp> </nodisp>
 +
 +### Mehr zu Dictionaries
 +
 +Du willst mehr über Dictionaries wissen und selber eines programmieren? [[dictionaries_tutorial|Schau hier]]!
 +
 +### Nächstes Kapitel
 +
 +Weiter mit [[gf_informatik:daten:processing:maps]].
  • gf_informatik/daten/processing/dictionaries.1655103519.txt.gz
  • Zuletzt geändert: 2022-06-13 06:58
  • von hof