2017-02-25 5 views
-1

1〜20文字のtxtファイルに単語数を出力したい。 これを試しましたが、代わりに20個のゼロが印刷されます。何か案が?ワードカウンタ|| python

編集 - 最終的に、プログラムは20個の数字をプロットする必要があり、それぞれ1〜20文字のファイル内の単語の数です。

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

プログラムロジックは完全に後方です。ファイルを反復して20文字の単語を探すのではなく、ファイルを20回繰り返します。 –

+0

1つの数字(20文字までの単語の数)または20の数字(潜在的な長さごとに、いくつの単語があるか)をお探しですか? – Mureinik

+0

20個の数字を探します。最初の数字は1文字のファイル内の単語の数、2番目の数字は2文字などの単語の数です。 – Jonathan

答えて

0

それはこのようにする必要があり、counterforループにすべきではない、とあなたは、単語の長さを取得するにはlen()メソッドを使用することができます。

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

それとも私の方法:

import re 

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

これが役に立ちます。あなたがcollections.Counterを使用することができ、各単語の長さのために、個々のカウントを生成するために

1

EDIT

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) 

これは、ファイルを読み込み、単語の長さのシーケンスを生成するために発電機を使用しています。フィルタリングされた語長は、Counterに入力されます。代わりにCounterで長さフィルタリングを実行できます。

句読点を無視する場合は、を使用して不要な文字を削除するか、おそらくline.split()の代わりにre.split(r'\W+', line)を使用します。


このようにそれを試してみてください。

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, 

これはに単純化することができます。

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

が、それは、コードゴルフをします。

ファイル全体をメモリに読み込むために実用的である場合にも、collections.Counterを使用することができます。

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) 

そして間違いなくそれを行うには、他の多くの方法があります。上記のどれも句読点を期待したり処理したりすることはできません。

+0

は最初に送信されたものです2番目のすべてのキーワード)、20の代わりに1つの番号を教えてくれました(私はそれについてコメントしました)。何が間違っていますか? – Jonathan

+0

何も間違っていません。質問をした後に要件を明確にしただけです。あなたは質問の明確化を行うべきです。 – mhawke

+0

@Jonathan:複数のカウントを生成するように更新されました。 – mhawke

0

使用して正規表現

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

OPから提供された明確な要件に基づいて回答を編集しました – Crispin