Kurs Python richtig lernen/Aufgabe 1: Shakespeare
Aus Geoinformation HSR
Zurück zum Kurs Python richtig lernen#Uebungen.
Inhaltsverzeichnis
anteil_hamlet.py
Siehe Kap. 2.6.3:
- Einlesen von Hamlet und gesammelte Werke von Shakespeare (enthalten in Musterloesungen.zip)
- Ausrechnen des Hamlet-Anteils an den gesammelten Werken, basierend auf der Anzahl Buchstaben
- Ausrechnen des Hamlet-Anteils an den gesammelten Werken, basierend auf der Anzahl Wörter
- Herausfinden wieviele Male Shakespeare das Wort 'ghost', 'Ghost', 'GHOST' oder ähnlich in seinem Leben benutzt hat
- Das häufigste Wort in Shakespeare's gesammelten Werken herausfinden
- Das häufigste Wort mit mindestens 5 Buchstaben in Shakespeare's gesammelten Werken herausfinden
Rechnet den Hamlet-Anteil an den gesammelten Werken Shakespeare's aus, basierend auf der Anzahl Buchstaben und Wörter
# -*- coding: utf-8 -*- # Einlesen von Hamlet und den gesammelten Werken Shakepeare's: hamlet_file = open('pg1524.txt') hamlet = hamlet_file.read() shakespeare_file = open('pg100.txt') shakespeare = shakespeare_file.read() # Der Anteil von Hamlet an den gesammelten Werken basierend auf der Anzahl # Buchstaben ist ganz einfach zu erhalten. Aufpassen nur mit dem Float...: anteil_hamlet_buchstaben = float(len(hamlet)) / len(shakespeare) * 100. # Nun müssen wir die Anzahl Wörter bestimmen. Dafür trennen wir ganz einfach # den Text in eine Liste auf basierend auf den Leerschlägen: hamlet_woerter = hamlet.split(' ') shakespeare_woerter = shakespeare.split(' ') anteil_hamlet_woerter = float(len(hamlet_woerter)) / len(shakespeare_woerter) * 100. # Nun können wir das Resultat ausgeben: print "Anteil von Hamlet an Shakespeare's Werken, basierend auf der Anzahl Buchstaben: %f Prozent" % anteil_hamlet_buchstaben print "Anteil von Hamlet an Shakespeare's Werken, basierend auf der Anzahl Woerter: %f Prozent" % anteil_hamlet_woerter
Hinweis: im Kap. 2.6.3 unten gibt es ein Code-Fragment für eine Variante mit direktem Web-Zugriff.
geister.py
Zählt wie viele Male Shakespeare das Wort 'ghost', 'Ghost', 'GHOST' oder ähnlich verwendet hat in seinem Leben.
# -*- coding: utf-8 -*- import time # Einlesen von Shakepeare's gesammelten Werken: f = open('pg100.txt') shakespeare = f.read() # Zuerst mal alles in Kleinbuchstaben umwandeln, damit wir alle Varianten von # 'ghost' abfangen: shakespeare = shakespeare.lower() # Nun haben wir zwei Möglichkeiten: # 1. Den Text in eine Liste Wörter auftrennen, und die Wörter zählen wo 'ghost' # vorkommt. # 2. Die Funktion find() gibt uns ja den Index zurück wo das Wort gefunden # wurde. find() hat auch ein optionales Argument 'start', wo man sagen kann # von welcher Stelle im String an gesucht werden soll. Durch intelligentes # Definieren einer Variablen können wir so die Geister auch zählen. # Hier folgen beide Möglichkeiten... Damit wir wissen, welche Methode schneller # ist haben wir noch die Zeit für beide Möglichkeiten gemessen. Das geht ganz # einfach mit dem time-Modul. Die Funktion time im time-Modul gibt die Anzahl # Sekunden (mit ein paar Dezimalstellen) die seit dem Anfang der Computer-Epoche # vergangen sind (normalerweise der 1.1.1970 auf Linux-Systemen) # Möglichkeit 1 mit Wörter auftrennen start_zeit_1 = time.time() woerter = shakespeare.split(' ') anzahl_geister = 0 for wort in woerter: if wort.find('ghost') > -1: anzahl_geister += 1 end_zeit_1 = time.time() # Möglichkeit 2 mit String durchlaufen start_zeit_2 = time.time() anzahl_geister_2 = 0 string_index = 0 # Das ist diese 'intelligente' Variable while True: geist = shakespeare.find('ghost', string_index) if geist < 0: # Falls keinen Geist mehr, brechen wir aus der Schlaufe aus break anzahl_geister_2 += 1 string_index = geist + 1 # String Index vorwärts schieben end_zeit_2 = time.time() # Nun sind wir fertig, also Resultat ausgeben print "Shakepeare brauchte %i Geister in seinem Leben" % anzahl_geister print "Shakepeare brauchte wirklich %i Geister" % anzahl_geister_2 print "Die 1. Moeglichkeit Geister zu zaehlen (Woerter auftrennen) brauchte %f Sekunden" % (end_zeit_1 - start_zeit_1, ) print "Die 2. Moeglichkeit Geister zu zaehlen (String durchlaufen) brauchte %f Sekunden" % (end_zeit_2 - start_zeit_2, ) print "Moeglichkeit 2 ist um ein Faktor %f schneller!" % ((end_zeit_1 - start_zeit_1) / (end_zeit_2 - start_zeit_2), ) print '''"Die ich rief, die Geister,\nWerd' ich nun nicht los."\n(Nein, das ist nicht von Shakespeare!)'''
haeufigste_woerter.py
Findet das häufigste Wort in Shakespeare's gesammelten Werken. Findet auch das häufigste Wort das länger ist als 5 Buchstaben.
# -*- coding: utf-8 -*- # Einlesen von Shakepeare's gesammelten Werken: f = open('pg100.txt') shakespeare = f.read() # Alles in Kleinbuchstaben umwandeln, da dies ja dasselbe Wort bleibt... shakespeare = shakespeare.lower() # In Wörter auftrennen woerter = shakespeare.split(' ') # Einzelne Wörter zählen mit Hilfe eines Dictionnaires word_count = {} for wort in woerter: w = wort.strip() # Leerzeichen um das Wort entfernen if len(w) > 0: word_count[w] = word_count.get(w, 0) + 1 # Nun haben wir alle Wörter gezählt und wir können nochmals durch den # Dictionnaire gehen und schauen was das häufigste Wort ist. haeufigstes_wort = '' anzahl_vorkommen = 0 for wort in word_count: if word_count[wort] > anzahl_vorkommen: haeufigstes_wort = wort anzahl_vorkommen = word_count[wort] print "Das haeufigste Wort ist '%s' mit %i Vorkommen." % (haeufigstes_wort, anzahl_vorkommen) # Und nun noch alle Wörter mit mindestens 5 Buchstaben: sehr ähnlich! haeufigstes_wort = '' anzahl_vorkommen = 0 for wort in word_count: if len(wort) >= 5 and word_count[wort] > anzahl_vorkommen: haeufigstes_wort = wort anzahl_vorkommen = word_count[wort] print "Das haeufigste Wort mit mindestens 5 Buchstaben ist '%s' mit %i Vorkommen." % (haeufigstes_wort, anzahl_vorkommen)
autopreise.py
Kap. 2.6.4.
Verwandle einen Text in eine Liste von Autopreisen. Jedes Element sol ein Dictionnaire sein; der KEy soll der Autoname sein und der Value der Preis (als Integer).
# -*- coding: utf-8 -*- f = open('pg100.txt') shakespeare = f.read() d={} ...