Kurs Python richtig lernen/Aufgabe 1: Shakespeare
Zurück zum Kurs Python richtig lernen#Uebungen.
anteil_hamlet.py
Aus Kap. 2.6.3 (16.1.2013).
- 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
Aus Kap. 2.6.3 (16.1.2013):
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
Aus Kap. 2.6.4 (16.1.2013).
Verwandle einen Text in eine Liste von Autopreisen. Jedes Element soll 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={}
...