Fehler im Programm?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
superjeffrey
User
Beiträge: 3
Registriert: Mittwoch 25. November 2015, 11:08

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
Zuletzt geändert von Anonymous am Mittwoch 25. November 2015, 11:23, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
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.
superjeffrey
User
Beiträge: 3
Registriert: Mittwoch 25. November 2015, 11:08

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.
Zuletzt geändert von Anonymous am Mittwoch 25. November 2015, 11:51, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
superjeffrey
User
Beiträge: 3
Registriert: Mittwoch 25. November 2015, 11:08

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
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?
stefanbunde
User
Beiträge: 29
Registriert: Dienstag 20. Oktober 2015, 12:59

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})
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@stefanbunde: für das einfache Hochzählen gibt es collections.Counter.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@stefanbund
Oder gleich Counter, wenn wir doch eh schon das collections Modul bemühen... :wink:
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
stefanbunde
User
Beiträge: 29
Registriert: Dienstag 20. Oktober 2015, 12:59

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