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
talit:python_intro [2025-02-23 21:12] – [4. String Formatting] scatalit:python_intro [2025-04-28 12:38] (aktuell) – [8. List Comprehensions] hof
Zeile 193: Zeile 193:
     print(f'| {plz:5} | {ort:<20} | {pop:12} | {ar:8} |')     print(f'| {plz:5} | {ort:<20} | {pop:12} | {ar:8} |')
 </code> </code>
 +
 +   * Linksbündig: `f"{name:20}"` oder `f"{name:<20}"`
 +   * Rechtsbündig: `f"{name:>20}"`
 +   * Zentriert: `f"{name:^20}"`
 +
 ++++ ++++
 </nodisp> </nodisp>
Zeile 204: Zeile 209:
   * JSON-Files lesen und erstellen können.   * JSON-Files lesen und erstellen können.
   * Mit Dictionaries arbeiten können.   * Mit Dictionaries arbeiten können.
-  * Selbständig arbeiten (Selber Tutorials suchen oder eine KI als Tutor benutzen)+  * Selbständig arbeiten ([[gf_informatik:daten_sca:datenverarbeitung_python#dictionaries_json|Tutorial aus GF von sca]] oder selber Tutorials suchen oder eine KI als Tutor benutzen, ...)
   * Im Zweifelsfall: [[https://docs.python.org/3/tutorial/|docs.python.org]]   * Im Zweifelsfall: [[https://docs.python.org/3/tutorial/|docs.python.org]]
  
-=== Auftrag ===+=== Auftrag I === 
 + 
 +   1. Lade den Datensatz `plz_schweiz.json` im **JSON-Format** herunter {{ :talit:plz_schweiz.json.zip |}} und **entzippe** diesen. 
 +   1. Lege das JSON-File in einem (noch zu erstellenden) Unterordner `data` in deinem Repo `talit_python` ab. 
 +   1. Erstelle ein neues Jupyter-Notebook (im obersten Ordner des Repos, *nicht* in `data`) mit Namen `dictionaries_json.ipynb`: Beantworte hier die Fragen von weiter unten mithilfe von Dictinaries. 
 +   1. Dokumentiere parallel die wichtigsten Befehle im *Portfolio*. 
 + 
 +**Fragen zu PLZ Schweiz:** 
 + 
 +Lies das JSON-File "plz_schweiz.json" ein und speichere es in einem Dictionary, z.B. mit Namen `data`. Schreibe dann Code, um folgende Fragen zu beantworten: 
 + 
 +   1. Welche Ortschaft hat die PLZ 6983? 
 +   1. Finde die PLZ von Samedan. 
 +   1. Wie viele Postleitzahlen gibt es für Zürich? 
 +   1. Erstelle eine Liste mit allen PLZ (1000-9999), welche noch nicht vergeben sind. 
 +   1. Du gründest deine eigene Ortschaft. Gib ihr einen Namen, wähle eine der freien PLZ und trage sie im Dictionary ein. 
 +   1. Wie viele 6000er Postleitzahlen gibt es? 
 +   1. In einer Volksabstimmung haben die Bewohnerinnen und Bewohner von Weinfelden beschlossen, dass die Stadt ab jetzt "Winefielden" heissen soll. Passe das Dictionary entsprechend an. 
 +   1. Die SalmsacherInnen haben beschlossen, sich Romanshorn anschliessen zu wollen. Entferne Salmsach aus dem Dictionary. 
 +   1. Welche Ortschaft hat den längsten Namen? Welche PLZ hat diese Ortschaft? 
 +   1. Wie viele Ortschaften fangen mit "W" an? 
 +   1. Speichere das Dictionary in einem neuen JSON `plz_schweiz_modifiziert.json`. 
 + 
 +=== Auftrag II ===
  
    1. Lade das "Ortschaftenverzeichnis Kanton Thurgau 2023" im **JSON-Format** herunter: https://opendata.swiss/de/dataset/ortschaftenverzeichnis-kanton-thurgau-2023 ...    1. Lade das "Ortschaftenverzeichnis Kanton Thurgau 2023" im **JSON-Format** herunter: https://opendata.swiss/de/dataset/ortschaftenverzeichnis-kanton-thurgau-2023 ...
-   1. ... und lege es in einem (noch zu erstellenden) Unterordner "datain deinem Repo "python\_portfolio" ab. +   1. ... und lege wieder in Unterordner `datain deinem Repo `talit_python` ab. 
-   1. Erstelle zwei neue Jupyter-Notebooks (im obersten Ordner des Repos, *nicht* in "data")+   1. Erstelle ein neues Jupyter-Notebook (im obersten Ordner des Repos, *nicht* in `data`mit Namen `dictionaries_json.ipynb`: Beantworte hier die Fragen von weiter unten mithilfe von Dictinaries.
-      1. `dictionaries_json.ipynb`: Erstelle hier eine Dokumentation mit den wichtigsten Infos zu Dictionaries & JSON +
-      1. `ortschaften_tg.ipynb`: Löse darin die Aufgaben von unten zum Datensatz "Ortschaftenverzeichnis Kanton Thurgau ..." +
-   1. Lade den Datensatz in Python ein, speichere diesen in der Variablen `data`. +
-   1. Schreibe nun in `ortschaften_tg.ipynb` den Code, der die **Fragen zum Datensatz Ortschaftenverzeichnis** unten beantwortet. Dokumentiere parallel alle wichtigen Befehle in `dictionaries_json.ipynb` +
-   1. Finde auf [[https://opendata.swiss/de]] einen **anderen Datensatz** den dich interessiert und extrahiere auf ähnliche Art und Weise interessante Informationen.+
  
 **Fragen zum Datensatz Ortschaftenverzeichnis:** **Fragen zum Datensatz Ortschaftenverzeichnis:**
 +
 +Lade den Datensatz in Python ein, speichere diesen in der Variablen `data`. Beantworte nun die folgenden Fragen:
  
    1. Finde deinen Wohnort und schaue die Daten dazu an.    1. Finde deinen Wohnort und schaue die Daten dazu an.
Zeile 230: Zeile 255:
    1. Lösche alle Einträge mit key `bezirk_nr`.    1. Lösche alle Einträge mit key `bezirk_nr`.
    1. Erstelle einen neuen Datensatz (Liste mit Dictionaries), welcher nur die Einträge der Ortschaften übernimmt, die über 2000 Einwohner haben. Schreibe diesen in ein neues JSON-File. Wichtig: Überschreibe *nicht* den ursprünglichen Datensatz.    1. Erstelle einen neuen Datensatz (Liste mit Dictionaries), welcher nur die Einträge der Ortschaften übernimmt, die über 2000 Einwohner haben. Schreibe diesen in ein neues JSON-File. Wichtig: Überschreibe *nicht* den ursprünglichen Datensatz.
 +
 +**Zusatzaufgabe:** Finde auf [[https://opendata.swiss/de]] einen **anderen Datensatz** den dich interessiert und extrahiere auf ähnliche Art und Weise interessante Informationen.
 +
  
 ===== - Ausnahmebehandlung mit try-except ===== ===== - Ausnahmebehandlung mit try-except =====
Zeile 265: Zeile 293:
  
 === Aufgabe 1: try-except === === Aufgabe 1: try-except ===
 +
 +Löse diese Aufgabe in eine neues File `try_except.ipynb`.
  
 Starte mit dem Code-Block: Starte mit dem Code-Block:
Zeile 296: Zeile 326:
  
 === Aufgabe 3: Guess Number === === Aufgabe 3: Guess Number ===
 +
 +Löse diese Aufgabe auch wieder im File `try_except.ipynb`.
  
    * **Kurz:** Programmiere ein Zahlenratespiel, bei dem eine bestimmte Zahl in möglichst wenig Versuchen erraten werden soll.    * **Kurz:** Programmiere ein Zahlenratespiel, bei dem eine bestimmte Zahl in möglichst wenig Versuchen erraten werden soll.
Zeile 318: Zeile 350:
  
 **Auftrag:** **Auftrag:**
 +
 +Löse Auftrag in Dokument `text_processing.ipynb`.
  
    1. Wähle einen der folgenden **langen Texte**, lade diesen herunter und entzippe diesen. Schreibe deinen Code unten so, dass er ohne Anpassungen auch für die anderen Text funktioniert.    1. Wähle einen der folgenden **langen Texte**, lade diesen herunter und entzippe diesen. Schreibe deinen Code unten so, dass er ohne Anpassungen auch für die anderen Text funktioniert.
Zeile 357: Zeile 391:
 ===== - List Comprehensions ===== ===== - List Comprehensions =====
  
-**Idee:** Listen in einer Zeile erstellen mit List Comprehensions+**Idee:** Listen in einer Zeile erstellen mit [[https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions|List Comprehensions]].
  
 **Programmierskills:** **Programmierskills:**
Zeile 368: Zeile 402:
      1. Liste mit den ersten 20 ungeraden Zahlen.      1. Liste mit den ersten 20 ungeraden Zahlen.
      1. Liste mit den ersten 20 Quadratzahlen: 1,4,9,...      1. Liste mit den ersten 20 Quadratzahlen: 1,4,9,...
-     1. String in Liste mit chars umwandeln: "KSR2024" -> ['K','S','R','2','0','2','4']. Verwendung von Funktion `list(...)` ist verboten.+     1. String in Liste mit chars umwandeln: `"KSR2024"-> `['K','S','R','2','0','2','4']`. Verwendung von Funktion `list(...)` ist verboten.
      1. Liste mit 10 Zufallszahlen im Bereich 0 bis 100.      1. Liste mit 10 Zufallszahlen im Bereich 0 bis 100.
-     1. Gib Liste mit Strings vor. Erstelle Liste, die Anzahl chars der einzelnen Strings angibt: ["Hallo","ksr","Romanshorn","7"] -> [5,3,10,1]\\ \\+     1. Gib Liste mit Strings vor. Erstelle Liste, die Anzahl chars der einzelnen Strings angibt: `["Hallo","ksr","Romanshorn","7"]-> `[5,3,10,1]`\\ \\
    1. **List Comprehensions mit Conditions:**    1. **List Comprehensions mit Conditions:**
      1. Gib eine Liste mit Zahlen vor. Erstelle eine Teilliste, welche nur die geraden Zahlen der ursprünglichen Liste beinhaltet.      1. Gib eine Liste mit Zahlen vor. Erstelle eine Teilliste, welche nur die geraden Zahlen der ursprünglichen Liste beinhaltet.
-     1. Gib eine Liste mit einzelnen Buchstaben vor. Erstelle Teilliste, welche nur Grossbuchstaben der ursprünglichen Liste beinhaltet. ['r','O','M','A','n','s','h','o','r','n',] -> ['O','M','A']+     1. Gib eine Liste mit einzelnen Buchstaben vor. Erstelle Teilliste, welche nur Grossbuchstaben der ursprünglichen Liste beinhaltet. `['r','O','M','A','n','s','h','o','r','n',]-> `['O','M','A']`
      1. Gleich wie letzte Aufgabe, nur soll ein String vorgegeben und erstellt werden: `"rOMAnshorn"` -> `"OMA"`. Idee: Erstelle *Liste* mit Grossbuchstaben und setzt diese dann zu einem String zusammen. Tipp: mit `''.join(my_list)` werden die Elemente in der Liste `my_list` zu einem String zusammengesetzt.\\ \\      1. Gleich wie letzte Aufgabe, nur soll ein String vorgegeben und erstellt werden: `"rOMAnshorn"` -> `"OMA"`. Idee: Erstelle *Liste* mit Grossbuchstaben und setzt diese dann zu einem String zusammen. Tipp: mit `''.join(my_list)` werden die Elemente in der Liste `my_list` zu einem String zusammengesetzt.\\ \\
    1. **Zusatzaufgaben (anspruchsvoll):**    1. **Zusatzaufgaben (anspruchsvoll):**
-     1. Liste mit allen Primzahlen bis 100. Verwende die Funktion `all(...)` (nutze KI als Tutor).+     1. Liste mit allen Primzahlen bis 100
 +       1. Nutze KI als Tutor! 
 +       1. Schreibe eine List-Comprehension, die alle Teiler einer Zahl erzeugt. 
 +         1. Primzahlen haben keinen Teiler ausser 1 und sich selbst.. 
 +       1. Verwende die Funktion `all(...)`
  
  
Zeile 462: Zeile 500:
 ===== Lösungen ===== ===== Lösungen =====
  
-<nodisp 2>+<nodisp 1>
 ++++For-Schleife & Funktionen| ++++For-Schleife & Funktionen|
  
Zeile 536: Zeile 574:
 ++++ ++++
  
 +</nodisp>
  
 +<nodisp 1>
 +++++Dictionaries & JSON Auftrag I|
 +
 +<code python>
 +import json
 +import os
 +import random
 +
 +PATH_DATA_LOAD = os.path.join('data','plz_schweiz.json') # so stellt sicher, dass Code auf Mac und Windows funktioniert
 +PATH_DATA_SAVE = os.path.join('data','plz_schweiz_modifiziert.json')
 +
 +with open(PATH_DATA_LOAD, 'r', encoding="utf-8") as json_file:
 +    data = json.load(json_file) # lade File in Dictionary data
 +
 +print("1.")
 +print(data['6983'])
 +
 +print("2.")
 +for plz,ort in data.items():
 +    if ort == "Samedan":
 +        print(plz)
 +        break
 +
 +print("3.")
 +count = 0
 +for plz,ort in data.items():
 +    if ort == "Zürich":
 +        count += 1
 +print(count)
 +
 +print("4.")
 +plz_frei = []
 +for i in range(1000,10000):
 +    if not str(i) in data:
 +        plz_frei.append(str(i))
 +print(plz_frei)
 +
 +print("5.")
 +data[plz_frei[7]] = "Schärertown"
 +for plz,ort in data.items():
 +    if ort == "Schärertowns":
 +        print(plz)
 +        break
 +
 +print("6.")
 +count = 0
 +for plz in data:
 +    if int(plz) // 1000 == 6:
 +        count += 1
 +print(count)
 +
 +print("7.")
 +for plz,ort in data.items():
 +    if ort == "Weinfelden":
 +        break
 +data[plz] = "Winefielden"
 +print(data[plz])
 +
 +print("8.")
 +for plz,ort in data.items():
 +    if ort == "Salmsach":
 +        print(plz)
 +        del data[plz]
 +        break
 +print(data.get('8599','Not found'))
 +
 +print("9.")
 +# loese in zwei Schritten: zuerst max, Laenge suchen, dann alle Orte finden mit dieser Laenge. 
 +max_length = 0
 +for ort in data.values():
 +    if len(ort) > max_length:
 +        max_length = len(ort)
 +print(max_length)
 +
 +for plz,ort in data.items():
 +    if len(ort) == max_length:
 +        print(plz,ort)
 +
 +print("10.")
 +with open(PATH_DATA_SAVE, "w", encoding="utf-8") as json_file:
 +    json.dump(data,json_file,indent=4,ensure_ascii=False) # Speichere Dictionary in JSON File
 +</code>
 +
 +++++
 +</nodisp>
 +
 +<nodisp 2>
 ++++Ausnahmebehandlung mit try-except| ++++Ausnahmebehandlung mit try-except|
  
Zeile 602: Zeile 728:
  
 ++++ ++++
 +
 +</nodisp>
 +
 +<nodisp 2>
  
 ++++Text Processing| ++++Text Processing|
  • talit/python_intro.1740345143.txt.gz
  • Zuletzt geändert: 2025-02-23 21:12
  • von sca