Seite 1 von 1
Fehler im Programm?
Verfasst: Mittwoch 25. November 2015, 11:18
von superjeffrey
Hallo Ihr Pythonfreunde
Ich habe einen kleine Code erstellt, er gibt aber nicht die Ausgabe her, die ich mir wünsche.
Das ist mein Code
Code: Alles auswählen
Neu = open('Neu.txt' , 'r')
for line in Neu:
inline = line.split() #Splitten aller Wörter in Neu.txt
#Hier sollen die Wörter gezählt werden mit der Hilfe eines Dictionaries
word_count = {}
for word in inline:
w = word.strip()
if len(w) > 0:
word_count[w] = word_count.get(w,0) + 1
print word_count
Das Prinzip funktioniert. Leider bekomme ich aber nur die zwei letzten Wörter des Textes gezählt:
Ich bekomme also: {'Hans':1, 'Eichmann':1}
Wieso werden nicht mit allen Wörter des Textes Wertpaare gebildet(bzw gezählt)? Ich sehe wirklich keinen Fehler in meinem Programm.
Ich freue mich auf Eure Inputs.
Beste Grüsse
Superjeff
Re: Fehler im Programm?
Verfasst: Mittwoch 25. November 2015, 11:28
von BlackJack
@superjeffrey: Du bindest in jedem Schleifendurchlauf in der ersten Schleife den Namen `inline` *neu*. Was auch immer im Schleifendurchlauf davor an den Namen gebunden wurde ist dann nicht mehr da. Damit sollte dann auch klar sein warum nur die Worte in der letzten Zeile der Datei gezählt werden.
Bezüglich der Namenschreibweise könntest Du mal einen Blick in den
Style Guide for Python Code werfen.
Dateien die man öffnet, sollte man auch wieder schliessen. Am sichersten geht das in dem man die Datei zusammen mit der ``with``-Anweisung öffnet.
Statt das manuell in einem Wörterbuch zu zählen gibt es übrigens `collections.Counter` genau für so etwas.
Re: Fehler im Programm?
Verfasst: Mittwoch 25. November 2015, 11:40
von superjeffrey
mh..... Heisst das ich muss diesen Ausdruck:
vorher als Funktion definieren mit (def)?
Sorry, irgendwie stell ich da echt blöd an, habe ich das Gefühl.
Re: Fehler im Programm?
Verfasst: Mittwoch 25. November 2015, 11:53
von superjeffrey
Ich habe es glaube ich geschafft.
Ich habe word_count = {} einfach vor der ersten Schleife gesetzt. Also gleich unter Neu = open ('Neu.txt', 'r')
Aber wieso geht es jetzt plötzlich? gibt es da keine praktischere Lösung?:) Naja, immerhin klappts jetzt
Re: Fehler im Programm?
Verfasst: Mittwoch 25. November 2015, 12:07
von BlackJack
@superjeffrey: Eine Funktion würde für das konkrete Problem nichts nützen, dann würde halt in der Funktion `inline` immer wieder an etwas neues gebunden für jede Zeile. *Das* darfst Du halt nicht machen. Du musst Dir alle Ergebnisse der Schleifendurchläufe merken und nicht immer nur den letzten. Du könntest das beispielsweise in einer Liste sammeln.
Grundsätzlich macht es allerdings schon Sinn Code in Funktionen aufzuteilen die eine in sich geschlossene Aufgabe abarbeiten, wie beispielsweise das Einlesen einer Datei in eine Liste mit Worten.
Edit: Du wirst noch mehr gemacht haben als nur die Definition von dem leeren Wörterbuch vor die erste Schleife zu ziehen. Warum das dann funktioniert solltest Du Dir dringend klarmachen. Also was der Unterschied im Programmablauf ist. Was meinst Du mit einer praktischeren Lösung?
Re: Fehler im Programm?
Verfasst: Mittwoch 25. November 2015, 16:34
von stefanbunde
für das einfache hochzählen bei den wörtern würde ich dir ein defaultdict empfehlen. kannst dich ja mal dazu belesen
Code: Alles auswählen
In [1]: from collections import defaultdict
In [2]: d = defaultdict(int)
In [3]: d["hans"] += 1
In [4]: d
Out[4]: defaultdict(<type 'int'>, {'hans': 1})
In [5]: d["hans"] += 1
In [6]: d
Out[6]: defaultdict(<type 'int'>, {'hans': 2})
In [7]: d["wurst"] += 1
In [8]: d
Out[8]: defaultdict(<type 'int'>, {'hans': 2, 'wurst': 1})
Re: Fehler im Programm?
Verfasst: Mittwoch 25. November 2015, 16:38
von Sirius3
@stefanbunde: für das einfache Hochzählen gibt es collections.Counter.
Re: Fehler im Programm?
Verfasst: Mittwoch 25. November 2015, 16:40
von mutetella
@stefanbund
Oder gleich
Counter, wenn wir doch eh schon das
collections Modul bemühen...

Re: Fehler im Programm?
Verfasst: Mittwoch 25. November 2015, 16:41
von stefanbunde
@sirius3: ja, auch wahr. defaultdict ist wohl besser geeignet für listen und son kram. hatte bisher noch keine counter benutzt, daher kam mir das dict zuerst in den sinn
