Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| lehrkraefte:snr:informatik:fachdidaktik:list-comprehension [2022/07/25 12:55] – [Bonusmaterial (Aufgaben, weitere Ideen, nachfolgende Themen)] Olaf Schnürer | lehrkraefte:snr:informatik:fachdidaktik:list-comprehension [2022/09/14 18:28] (current) – [Aufgabe 3 zu Goethes Faust: Wortlängen (samt Darstellung als Säulendiagramm)] Olaf Schnürer | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ~~NOTOC~~ | ||
| + | ====== Fortgeschrittene Techniken für Listen samt Aufgaben zu Goethes Faust ====== | ||
| + | |||
| + | ==== Nützliche Funktionen und list comprehension ==== | ||
| + | |||
| + | Bitte anschauen: [[https:// | ||
| + | |||
| + | In vorigen Lektionen hast du bereits Listen kennengelernt. Heute wirst du neben einigen Funktionen für Listen insbesondere **list comprehension** kennenlernen, | ||
| + | |||
| + | Danach gibt es als Lernkontrolle einige Aufgaben zum Text von Goethes Faust - dieser Text wird dir als Liste zur Verfügung gestellt. Beispielsweise wirst du herausfinden, | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Außerdem wirst du herausfinden, | ||
| + | |||
| + | ==== Empfohlenes Vorgehen ==== | ||
| + | |||
| + | * Checke, ob du die im nächsten Abschnitt beschriebenen Vorkenntnisse hast. | ||
| + | * Wenn dies der Fall ist, sollten Aufgabe 0 und Aufgabe 1 schnell gelöst sein. | ||
| + | * Schau dir das Erklärvideo zu Listenfunktionen an und löse die darin gestellten Aufgaben. | ||
| + | * Schau dir das Erklärvideo zu //list comprehension// | ||
| + | * Bearbeite die Aufgaben 2, 3 und 4 zur Erprobung des Gelernten. | ||
| + | |||
| + | ===== Vorkenntnisse ===== | ||
| + | |||
| + | Wir nehmen an, dass du | ||
| + | * mindestens die im folgenden Link erklärten Sachverhalte über Listen und Strings kennst: [[lehrkraefte: | ||
| + | |||
| + | Nützlich, aber nicht zwingend erforderlich ist es, wenn du mit Visual Studio Code (= VS Code) vertraut bist: | ||
| + | * Du weißt, wie man dort Python-Programme schreibt und ausführt ('' | ||
| + | * Du weißt, wie man im Terminal von VS Code eine interaktive Python-Session öffnet und benutzt. | ||
| + | * Die Vorbereitungen in Aufgabe 0 im nächsten Abschnitt stellen dich vor keinerlei Probleme. | ||
| + | |||
| + | |||
| + | ===== Allgemeine Vorbereitung und Test der Vorkenntnisse ===== | ||
| + | |||
| + | ==== Aufgabe 0: Vorbereitung ==== | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Erstelle ein neues Verzeichnis namens '' | ||
| + | |||
| + | Öffne dieses Verzeichnis mit VS Code und öffne darin eine neue, leere Datei mit dem Namen '' | ||
| + | |||
| + | <code python> | ||
| + | eingabeDatei = open(" | ||
| + | wortliste = eingabeDatei.read().splitlines() | ||
| + | eingabeDatei.close() | ||
| + | print(" | ||
| + | print(wortliste[2454: | ||
| + | </ | ||
| + | |||
| + | Die folgende Datei enthält alle Wörter aus Goethes Faust (Teil I und Teil II) in der richtigen Reihenfolge. Speichere sie in deinem neu erstellten Verzeichnis ab, indem du sie mit der rechten Maustaste anklickst und " | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Führe das Python-Programm aus (per '' | ||
| + | |||
| + | <hidden Erwartete Ausgabe> | ||
| + | <code text> | ||
| + | Berühmte Passage: | ||
| + | [' | ||
| + | </ | ||
| + | |||
| + | <WRAP center round box 90%> | ||
| + | Falls es wider Erwarten nicht mit dem Einlesen der Wörter aus der Datei klappt: | ||
| + | |||
| + | Im folgenden Python-Programm ist die faustsche Wörterliste explizit in der ersten (sehr langen) Zeile angegeben: {{ : | ||
| + | |||
| + | Speichere diese Datei (per Anklicken mit der rechten Maustaste) ab und führe sie aus. Arbeite im Folgenden mit dem Python-Programm '' | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP center round important 80%> | ||
| + | Alle folgenden Aufgaben zur Analyse des Faust-Textes starten mit dem Programm '' | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Aufgabe 1 zu Goethes Faust: Test der Vorkenntnisse ==== | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Ergänze das Programm '' | ||
| + | * (1a) die Anzahl der Wörter in Goethes Faust ausgegeben wird; | ||
| + | * (1b) die ersten 10 Wörter als Liste ausgegeben werden (es handelt sich um Wörter aus dem Inhaltsverzeichnis); | ||
| + | * < | ||
| + | * (1d) die berühmte Passage (= der Anfang von Fausts Monolog) rückwärts ausgegeben wird (als Liste). | ||
| + | Wenn du willst, kannst du das Programm unter einem beliebigen Namen deiner Wahl (etwa '' | ||
| + | |||
| + | <hidden Hinweise für 1a-1c> | ||
| + | Lies [[lehrkraefte: | ||
| + | </ | ||
| + | <hidden Hinweis zu 1d> | ||
| + | Verwende eine Zusatzvariable '' | ||
| + | <hidden Weiterer Hinweis zu 1d> | ||
| + | Gib die Liste '' | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | <hidden Antwort zu 1a> | ||
| + | 76101 Wörter | ||
| + | </ | ||
| + | <hidden Antwort zu 1b> | ||
| + | <code text> | ||
| + | [' | ||
| + | </ | ||
| + | </ | ||
| + | <hidden Antwort zu 1c> | ||
| + | <code text> | ||
| + | [' | ||
| + | </ | ||
| + | </ | ||
| + | <hidden Antwort zu 1d> | ||
| + | <code text> | ||
| + | [' | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | |||
| + | ---- | ||
| + | |||
| + | <hidden Lösungsvorschlag> | ||
| + | <code python> | ||
| + | eingabeDatei = open(" | ||
| + | wortliste = eingabeDatei.read().splitlines() | ||
| + | eingabeDatei.close() | ||
| + | print(" | ||
| + | print(wortliste[2454: | ||
| + | # Teilaufgabe 1a | ||
| + | print(" | ||
| + | print(len(wortliste)) | ||
| + | # Teilaufgabe 1b | ||
| + | print(" | ||
| + | print(wortliste[: | ||
| + | # Teilaufgabe 1c | ||
| + | print(" | ||
| + | print(wortliste[-10: | ||
| + | # Teilaufgabe 1d | ||
| + | print(" | ||
| + | faustMonolog = wortliste[2454: | ||
| + | print(faustMonolog[:: | ||
| + | # Alternative 1 zu 1d: | ||
| + | # print(wortliste[2469: | ||
| + | # Alternative 2 zu 1d: | ||
| + | # print(wortliste[2454: | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Nützliche Funktionen und Methoden für Listen ===== | ||
| + | |||
| + | |||
| + | Schau nun das [[https:// | ||
| + | |||
| + | Darin werden die fünf Listen-Funktionen((Es handelt sich dabei um sogenannte //built-in functions//, | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ===== List comprehension ===== | ||
| + | |||
| + | Die Bezeichnung "list comprehension" | ||
| + | |||
| + | List comprehension wird in dem [[https:// | ||
| + | |||
| + | Erklärt werden "list comprehension-Ausdrücke" | ||
| + | |||
| + | ===== Aufgaben dazu ===== | ||
| + | |||
| + | ==== Aufgabe 2 zu Goethes Faust: Vorkommen des Wortes " | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Ergänze das Programm '' | ||
| + | * (2a) ausgegeben wird, wie oft das Wort '' | ||
| + | <hidden Hinweis> | ||
| + | - Möglichkeit: | ||
| + | - Möglichkeit: | ||
| + | </ | ||
| + | <hidden Antwort> | ||
| + | 8 Mal | ||
| + | </ | ||
| + | ---- | ||
| + | * (2b) ausgegeben wird, an welcher Position das Wort '' | ||
| + | <hidden Hinweis> | ||
| + | <hidden Antwort> | ||
| + | An Position 15247 (in Informatik-Zählweise). | ||
| + | </ | ||
| + | ---- | ||
| + | * (2c) der " | ||
| + | <hidden Hinweis> | ||
| + | Gib eine geeignete Teilliste der Liste '' | ||
| + | <hidden Weiterer Hinweis> | ||
| + | <hidden Antwort> | ||
| + | <code text> | ||
| + | [' | ||
| + | </ | ||
| + | </ | ||
| + | ---- | ||
| + | |||
| + | * (2d) eine Liste aller Positionen (in informatischer Zählweise) ausgegeben wird, an denen das Wort '' | ||
| + | <hidden Hinweis> | ||
| + | Die gesuchte Liste ist eine Teilliste der Liste aller Zahlen von 0 bis zur Länge unserer Wortliste (minus Eins). Beschreibe diese Teilliste durch eine geeignete //list comprehension// | ||
| + | <hidden Weiterer Hinweis> | ||
| + | </ | ||
| + | <hidden Antwort> | ||
| + | <code text> | ||
| + | [15247, 15980, 16094, 16483, 16855, 16903, 16927, 25973] | ||
| + | </ | ||
| + | </ | ||
| + | ---- | ||
| + | <hidden Lösungsvorschlag> | ||
| + | <code python> | ||
| + | eingabeDatei = open(" | ||
| + | wortliste = eingabeDatei.read().splitlines() | ||
| + | eingabeDatei.close() | ||
| + | print(" | ||
| + | print(wortliste[2454: | ||
| + | # Teilaufgabe 2a | ||
| + | print(" | ||
| + | print(wortliste.count(" | ||
| + | # Alternative: | ||
| + | # print(len([x for x in wortliste if x == " | ||
| + | # Teilaufgabe 2b | ||
| + | print(" | ||
| + | print(wortliste.index(" | ||
| + | # Teilaufgabe 2c | ||
| + | print(" | ||
| + | erstePositionHexe= wortliste.index(" | ||
| + | print(wortliste[erstePositionHexe-10: | ||
| + | # Teilaufgabe 2d | ||
| + | print(" | ||
| + | print([i for i in range(len(wortliste)) if wortliste[i] == " | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== Aufgabe 3 zu Goethes Faust: Wortlängen (samt Darstellung als Säulendiagramm) ==== | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | |||
| + | Starte wieder mit dem Programm '' | ||
| + | |||
| + | * (3a) Definiere eine Liste namens '' | ||
| + | <hidden Hinweis> | ||
| + | Diese List kann mit einer //list comprehension// | ||
| + | </ | ||
| + | ---- | ||
| + | * (3b) Speichere die Länge des längsten Wortes (oder der längsten Wörter) in Goethes Faust in der Variable '' | ||
| + | <hidden Hinweis> | ||
| + | Verwende die Funktion '' | ||
| + | </ | ||
| + | <hidden Antwort> | ||
| + | Die maximale Wortlänge ist 32. | ||
| + | </ | ||
| + | ---- | ||
| + | * (3c) Definiere eine Liste '' | ||
| + | * Bemerkung: In der folgenden [[lehrkraefte: | ||
| + | <hidden Hinweis> | ||
| + | Die Methode '' | ||
| + | <hidden Weiterer Hinweis> | ||
| + | Die gesuchte Liste kann mit einer //list comprehension// | ||
| + | <hidden Weiterer Hinweis> | ||
| + | '' | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | ---- | ||
| + | <hidden Lösungsvorschlag> | ||
| + | <code python> | ||
| + | eingabeDatei = open(" | ||
| + | wortliste = eingabeDatei.read().splitlines() | ||
| + | eingabeDatei.close() | ||
| + | print(" | ||
| + | print(wortliste[2454: | ||
| + | # Teilaufgabe 3a | ||
| + | wortlaengen = [len(w) for w in wortliste] | ||
| + | # Teilaufgabe 3b | ||
| + | maxLaenge = max(wortlaengen) | ||
| + | print(" | ||
| + | print(maxLaenge) | ||
| + | # Teilaufgabe 3c | ||
| + | anzahlBeiLaenge = [wortlaengen.count(i) for i in range(maxLaenge + 1)] | ||
| + | print(" | ||
| + | print(anzahlBeiLaenge) | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP center round info> | ||
| + | === Darstellung als Säulendiagramm === | ||
| + | Mit der Python-Bibliotheken '' | ||
| + | <code python> | ||
| + | from matplotlib import pyplot as plt | ||
| + | |||
| + | def zeichneSaeulendiagramm(xWerte, | ||
| + | # xWerte: Liste der Werte auf der horizontalen Achse | ||
| + | # yWerte: Liste der zugehörigen Funktionswerte | ||
| + | # titel: Titel der Graphik | ||
| + | # xBeschriftung: | ||
| + | # yBeschriftung: | ||
| + | plt.figure(" | ||
| + | plt.title(titel) | ||
| + | plt.xlabel(xBeschriftung) | ||
| + | plt.ylabel(yBeschriftung) | ||
| + | plt.bar(xWerte, | ||
| + | plt.xticks(xWerte, | ||
| + | plt.tight_layout() | ||
| + | plt.show() | ||
| + | |||
| + | zeichneSaeulendiagramm(range(maxLaenge + 1), anzahlBeiLaenge, | ||
| + | </ | ||
| + | |||
| + | <WRAP center round tip> | ||
| + | Eventuell musst du die Bibliothek '' | ||
| + | <code text> | ||
| + | python -m pip install -U pip | ||
| + | python -m pip install -U matplotlib | ||
| + | </ | ||
| + | Der erste Befehl installiert '' | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | |||
| + | <WRAP center round help> | ||
| + | Hier stellt sich etwa die " | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Aufgabe 4 zu Goethes Faust: Palindrome ==== | ||
| + | |||
| + | Palindrome sind Wörter (und manchmal auch Sätze), die von vorne wie von hinten gelesen dasselbe Wort liefern, vgl. https:// | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Starte wieder mit dem Programm '' | ||
| + | |||
| + | Die Liste '' | ||
| + | |||
| + | Ergänze das Programm am Ende um die Code-Zeile | ||
| + | <code python> | ||
| + | wortlisteOhneWiederholungen = list({x.lower() for x in wortliste}) | ||
| + | </ | ||
| + | |||
| + | Die Liste '' | ||
| + | '' | ||
| + | |||
| + | Ergänze das Programm so, dass | ||
| + | * (4a) eine alphabetisch sortierte Liste aller Wörter der Länge 19 ausgegeben wird. | ||
| + | <hidden Hinweis> | ||
| + | Die Funktion '' | ||
| + | <hidden Weiterer Hinweis> | ||
| + | Erstelle mit einer geeigneten //list comprehension// | ||
| + | </ | ||
| + | </ | ||
| + | <hidden Antwort> | ||
| + | <code text> | ||
| + | List der Wörter der Länge 19, alphabetisch sortiert: | ||
| + | [' | ||
| + | </ | ||
| + | </ | ||
| + | ---- | ||
| + | * (4b) Eine alphabetisch sortierte Liste aller Wörter, die mit dem Buchstaben ' | ||
| + | <hidden Hinweis> | ||
| + | Gehe ähnlich vor wie bei der vorigen Aufgabe. Den ersten Buchstaben eines Strings '' | ||
| + | </ | ||
| + | <hidden Antwort> | ||
| + | <code text> | ||
| + | Liste der mit ' | ||
| + | [' | ||
| + | </ | ||
| + | </ | ||
| + | ---- | ||
| + | * (4c) Eine Liste aller Palindromwörter in Goethes Faust ausgegeben wird; außerdem soll die Anzahl aller Palindromwörter ausgegeben werden. (Genauer sind damit diejenigen Wörter im Faust gemeint, die auch von hinten gelesen im Faust auftauchen.) | ||
| + | <hidden Hinweis> | ||
| + | Wie kann man feststellen, | ||
| + | <hidden Weiterer Hinweis> | ||
| + | Der String '' | ||
| + | <hidden Weiterer Hinweis> | ||
| + | Genau dann ist '' | ||
| + | <hidden Weiterer Hinweis> | ||
| + | Verwende //list comprehension//, | ||
| + | <hidden Weiterer Hinweis> | ||
| + | '' | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | <hidden Antwort> | ||
| + | <code text> | ||
| + | Liste der Palindrome, alphabetisch sortiert: | ||
| + | [' | ||
| + | Anzahl der Palindrome: | ||
| + | 23 | ||
| + | </ | ||
| + | </ | ||
| + | ---- | ||
| + | <hidden Lösungsvorschlag> | ||
| + | <code python> | ||
| + | eingabeDatei = open(" | ||
| + | wortliste = eingabeDatei.read().splitlines() | ||
| + | eingabeDatei.close() | ||
| + | print(" | ||
| + | print(wortliste[2454: | ||
| + | wortlisteOhneWiederholungen = list({x.lower() for x in wortliste}) | ||
| + | # Teilaufgabe 4a | ||
| + | wortliste19 = [s for s in wortlisteOhneWiederholungen if len(s) == 19] | ||
| + | print(" | ||
| + | print(sorted(wortliste19)) | ||
| + | # Teilaufgabe 4b | ||
| + | wortlisteQ = [s for s in wortlisteOhneWiederholungen if s[0] == " | ||
| + | print(" | ||
| + | print(sorted(wortlisteQ)) | ||
| + | # Teilaufgabe 4c | ||
| + | palindromliste = [s for s in wortlisteOhneWiederholungen if s == s[::-1]] | ||
| + | print(" | ||
| + | print(sorted(palindromliste)) | ||
| + | print(" | ||
| + | print(len(palindromliste)) | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== Bonusmaterial (Aufgaben, weitere Ideen, nachfolgende Themen) ===== | ||
| + | |||
| + | Siehe [[lehrkraefte: | ||
| + | |||
| + | ===== Nachfolgende Themen (folgende Lektionen) ===== | ||
| + | |||
| + | * Verschachtelte Listen | ||
| + | * Kopieren von Listen (shallow copy, deep copy) und dadurch motiviert: | ||
| + | * mutable and immutable data types (deutsch etwa: veränderliche und unveränderliche Datentypen); | ||
| + | * Wie bekomme ich einen beliebigen Text aus dem Internet in Listenform? | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||