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.

Hinweis 0

Hinweis 0

Orientiere dich an Aufgabe 3 inklusive der danach gegebenen Anleitung zum Zeichnen des Säulendiagramms.

Genaueres wird in den folgenden Hinweisen erklärt.

Hinweis 1

Hinweis 1

Erzeuge zuerst eine Liste aller Buchstaben im Faust.

Das geht so per list comprehension:

Das geht so per list comprehension:

buchstabenliste = [b for w in wortliste for b in w.lower()]

Hinweis 2

Hinweis 2

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.

Hinweis 3

Hinweis 3

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.

Lösungsvorschlag

Lösungsvorschlag

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”.

Lösungsvorschlag zu Teilaufgabe B2a

Lösungsvorschlag zu Teilaufgabe B2a

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.

Lösungsvorschlag zu beiden Teilaufgaben

Lösungsvorschlag zu beiden Teilaufgaben

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

Retour zur Hauptseite

Fortgeschrittene Techniken für Listen samt Aufgaben zu Goethes Faust