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:

Code: Alles auswählen

for line in Neu:
    inline = line.split()
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... :wink:

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 :-)