~~NOTOC~~ ====== Bonusmaterial (Aufgaben, weitere Ideen, nachfolgende Themen) ====== ===== Bonusaufgaben ===== ==== Bonus-Aufgabe B1 zu Goethes Faust: Buchstabenhäufigkeiten - Darstellung als Säulendiagramm ==== Schreibe ein Programm, das zählt, wie häufig (in Prozent) jeder der 26+3+1 Buchstaben (a-z, Umlaute, scharfes s) im Faust vorkommt und stelle das Ergebnis durch ein Säulendiagramm dar. Orientiere dich an Aufgabe 3 inklusive der danach gegebenen Anleitung zum Zeichnen des Säulendiagramms. Genaueres wird in den folgenden Hinweisen erklärt. Erzeuge zuerst eine Liste aller Buchstaben im Faust. ''buchstabenliste = [b for w in wortliste for b in w.lower()]'' Verwende die Liste ''alphabet = [x for x in "abcdefghijklmnopqrstuvwxyzäöüß"]'' und //list comprehension//, um eine Liste ''prozentualeHaeufigkeit'' zu erzeugen, deren erster Eintrag angibt, wie häufig der Buchstabe ''a'' vorkommt, usw. und deren letzter Eintrag angibt, wie häufig der "Buchstabe" ''ß'' vorkommt, etc. Zeichne das Säulendiagramm mit dem Befehl ''zeichneSaeulendiagramm(alphabet, prozentualeHaeufigkeit, 'Prozentuale Häufigkeit der Buchstaben', 'Buchstaben', 'in %')''. Zuvor muss natürlich wie oben diese Funktion definiert werden. eingabeDatei = open("faust-1-und-2.txt", encoding='utf-8') wortliste = eingabeDatei.read().splitlines() eingabeDatei.close() buchstabenliste = [b for w in wortliste for b in w.lower()] anzahlBuchstaben = len(buchstabenliste) alphabet = [x for x in "abcdefghijklmnopqrstuvwxyzäöüß"] prozentualeHaeufigkeit = [buchstabenliste.count(b) / anzahlBuchstaben * 100 for b in alphabet] from matplotlib import pyplot as plt def zeichneSaeulendiagramm(xWerte, yWerte, titel, xBeschriftung, yBeschriftung): # xWerte: Liste der Werte auf der horizontalen Achse # yWerte: Liste der zugehörigen Funktionswerte # titel: Titel der Graphik # xBeschriftung: Text unter der horizontalen Achse # yBeschriftung: Text links der vertikalen Achse plt.figure("Säulendiagramm-Fenster") plt.title(titel) plt.xlabel(xBeschriftung) plt.ylabel(yBeschriftung) plt.bar(xWerte, yWerte, color='blue') plt.xticks(xWerte, xWerte, rotation='horizontal') plt.tight_layout() plt.show() zeichneSaeulendiagramm(alphabet, prozentualeHaeufigkeit, 'Prozentuale Häufigkeit der Buchstaben', 'Buchstaben', 'Häufigkeit in %') ==== (relativ anspruchsvolle) Bonus-Aufgabe B2 zu Goethes Faust: Anagramme ==== Ein //Anagramm// ist ein Wort, das durch Umstellen der Buchstaben ein anderes Wort ergibt, vgl. https://de.wikipedia.org/wiki/Anagramm. * (B2a) Schreibe ein Programm, das alle Anagramme in Goethes Faust findet. Genauer sind wir an allen Wörtern im Faust interessiert, aus denen man durch Umstellen der Buchstaben ein anderes Wort bilden kann, **das ebenfalls im Faust vorkommt**. Hinweise: Verwende die Funktion def ordneAlphabetisch(s): return ''.join(sorted(s)) Sie nimmt ein Wort entgegen und ordnet es alphabetisch: Beispielsweise liefert ''ordneAlphabetisch("andromeda")'' das Wort ''"aaddemnor"''. Mit Hilfe dieser Funktion kann man leicht entscheiden, ob zwei Wörter "Anagramme voneinander sind". eingabeDatei = open("faust-1-und-2.txt", encoding='utf-8') wortliste = eingabeDatei.read().splitlines() eingabeDatei.close() # Teilaufgabe B2a def ordneAlphabetisch(s): return ''.join(sorted(s)) wortlisteOhneWiederholungen = list({x.lower() for x in wortliste}) alphabetischGeordnet = [ordneAlphabetisch(x) for x in wortlisteOhneWiederholungen] anagramme = [x for x in wortlisteOhneWiederholungen if alphabetischGeordnet.count(ordneAlphabetisch(x)) > 1] print("Liste der Anagramme:") print(anagramme) print("Anzahl der Anagramme:") print(len(anagramme)) ---- * (B2b) Ändere die Ausgabe so, dass * jedes Anagramm zusammen mit seinen "Partner-Anagrammen" als Liste in einer Zeile ausgegeben wird; * jedes Anagramm genau einmal ausgegeben wird; * optional: Gib nur "interessante" Anagramme aus: Gib beispielsweise nur solche Anagramme aus, die mindestens aus zehn Buchstaben bestehen oder mindestens vier "Partner-Anagramme" haben. ---- eingabeDatei = open("faust-1-und-2.txt", encoding='utf-8') wortliste = eingabeDatei.read().splitlines() eingabeDatei.close() # Teilaufgabe B2a def ordneAlphabetisch(s): return ''.join(sorted(s)) wortlisteOhneWiederholungen = list({x.lower() for x in wortliste}) alphabetischGeordnet = [ordneAlphabetisch(x) for x in wortlisteOhneWiederholungen] anagramme = [x for x in wortlisteOhneWiederholungen if alphabetischGeordnet.count(ordneAlphabetisch(x)) > 1] print("Liste der Anagramme:") print(anagramme) print("Anzahl der Anagramme:") print(len(anagramme)) # Teilaufgabe B2b for x in list({ordneAlphabetisch(x) for x in anagramme}): anagrammeDavon = [a for a in anagramme if ordneAlphabetisch(a) == x] print(anagrammeDavon) # Lösung der optionalen Aufgabe: Kommentiere die vorige Zeile aus und entkommentiere die folgenden beiden Zeilen: # if len(x) >= 12 or len(anagrammeDavon) >= 4: # print(anagrammeDavon) ===== Weitere Ideen zur Text-Analyse ===== * Häufigkeit von Wörtern: * Welches Wort kommt am häufigsten in Goethes Faust vor? * Erstelle eine Liste der 20 am häufigsten vorkommenden Wörter und stelle diese in einem Säulendiagramm dar. * Sortiere die Liste der Wörter nach ihrer Häufigkeit. * Wie gross ist der Sprechanteil der verschiedenen Personen (Faust, Mephisto, Gretchen etc.)? - Sprecher sind im Text in Großbuchstaben angegeben, etwa FAUST etc. (Überschriften, Regieanweisungen etc. sind aber wohl nicht erkennbar.) * Kannst du anhand der Buchstabenhäufigkeiten herausfinden, in welcher Sprache ein Text geschrieben ist? (Problem hierbei: Bekomme andere Texte als Liste.) * Welche Fragen fallen dir ein? ===== Retour zur Hauptseite ===== [[lehrkraefte:snr:informatik:fachdidaktik:list-comprehension|Fortgeschrittene Techniken für Listen samt Aufgaben zu Goethes Faust]]