2017-02-25 1 views
-1

Ich möchte die Anzahl der Wörter in einer TXT-Datei mit 1-20 Buchstaben drucken. Versuchte dies, aber es druckt stattdessen 20 Nullen. irgendeine Idee?Wortzähler || Python

bearbeiten - am Ende sollte das Programm 20 Zahlen plotten, jedes ist die Anzahl der Wörter in der Datei mit 1-20 Buchstaben.

fin = open('words.txt') 
for i in range(20): 
    counter = 0 
    for line in fin: 
     word = line.strip() 
     if len(word) == i: 
      counter = counter + 1 
    print counter, 
+0

Die Programmlogik ist vollständig nach hinten. Statt über die Datei zu iterieren und nach Wörtern mit 20 Zeichen zu suchen, iterieren Sie 20 Mal über die Datei. –

+0

Suchen Sie nach einer Nummer (Anzahl der Wörter bis zu 20 Zeichen) oder 20 Zahlen (pro mögliche Länge, wie viele Wörter gibt es)? – Mureinik

+0

Suche nach 20 Zahlen, was bedeutet, dass die erste Zahl ist die Anzahl der Wörter in der Datei mit 1 Buchstaben, die zweite Zahl ist die Anzahl der Wörter mit 2 Buchstaben usw. – Jonathan

Antwort

0

es so sein sollte, counter sollte nicht in for Schleife sein, und man konnte len() Methode verwenden, um die Länge von Wörtern zu bekommen:

with open("test") as f: 
    counter = 0 
    for line in f: 
     for word in line.split(): 
      if len(word)<=20: 
       counter+=1 
    print counter 

Oder mein Weg:

import re 

with open("file") as f: 
    print len(filter(lambda x:len(x)<20,re.split('\n| ', f.read()))) 

Hoffe das hilft.

1

EDIT

für jede Wortlänge Einzelne zählt erzeugen Sie eine collections.Counter verwenden können:

from collections import Counter 

def word_lengths(f): 
    for line in f: 
     for word in line.split(): # does not ignore punctuation 
      yield len(word) 

with open('words.txt') as fin:   
    counts = Counter(length for length in word_lengths(fin) if length <= 20) 

die Datei Dieser verwendet einen Generator zu lesen und eine Folge von Wortlängen zu erzeugen. Die gefilterten Wortlängen werden in einen Counter eingespeist. Sie können stattdessen die Längenfilterung auf dem Counter durchführen.

Wenn Sie Interpunktion ignorieren möchten, können Sie mit str.translate() unerwünschte Zeichen entfernen, oder möglicherweise re.split(r'\W+', line) anstelle von line.split().


es so versuchen:

with open('words.txt') as fin: 
    counter = 0 
    for line in fin: 
     for word in line.split(): 
      if len(word) <= 20: 
       counter = counter + 1 
    print counter, 

Dies vereinfacht werden könnte:

with open('words.txt') as fin: 
    counter = sum([1 for line in fin 
         for word in line.split() if len(word) <= 20]) 

aber das spielt Code Golf.

Sie können auch eine collections.Counter verwenden, wenn es die gesamte Datei in den Speicher zu lesen praktisch ist:

from collections import Counter 

with open('words.txt') as fin: 
    c = Counter(fin.read().split()) 
    counter = sum(c[k] for k in c if len(k) <= 20) 

Und kein Zweifel, es gibt viele andere Möglichkeiten, es zu tun. Keines der oben genannten Elemente erwartet Interpunktionszeichen oder behandelt sie.

+0

versuchte die erste, die Sie gesendet haben (nicht gelernt haben alle Schlüsselwörter in der Sekunde), gab mir eine Zahl anstelle von 20. (Ich kommentierte es), haben irgendeine Ahnung, was falsch ist? – Jonathan

+0

Nichts ist falsch, es ist nur, dass Sie Ihre Anforderung geklärt haben, nachdem Sie die Frage gestellt haben.Sie sollten die Klärung in der Frage machen. – mhawke

+0

@ Jonathan: Antwort aktualisiert, um mehrere Zählungen zu erzeugen. – mhawke

0

mit regulären Ausdrücken

import re 

REGEX = r"(\b\S{1,20}\b)" 
finder = re.compile(REGEX) 

with open("words.txt") as out: 
    data = out.read() 

matches = re.findall(finder, data) 

lst = [0 for _ in range(20)] 

for m in matches: 
    lst[len(m)] += 1 

print(lst) 
+0

Ich habe meine Antwort basierend auf geklärten Anforderungen von OP bearbeitet – Crispin