0

「GlassDog.txt」という名前のテキストドキュメント内のすべての単語を読み取るプログラムを作成しようとしています。プログラムが単語を読み取ったら、すべての句読点を削除し、すべての文字を小文字にする必要があります。次に、プログラムがこれですべて終了したら、見つかった単語と、ドキュメントで使用された回数を印刷します。

これまでの私のコードは次のとおりです。

def run():
    count = {} 
    for w in open('GlassDog.txt').read().split(): 
        if w in count: 
            count[w] += 1 
        else: 
            count[w] = 1

    for word, times in count.items(): 
        print ("%s was found %d times" % (word, times)) 

run()

このコードは、単語と単語の頻度を読み取って表示します。ただし、句読点を削除して大文字を小文字に置き換えるコードを実装する方法を見つけることができませんでした。この質問はおそらく数回聞かれましたが、私が探しているものを具体的に実行するものを見つけることができなかったようです。繰り返しの質問である場合は、お詫び申し上げます。

4

4 に答える 4

1
from collections import Counter

def just_alnum(s):
    return ''.join(c for c in s if c.isalnum())

with open('GlassDog.txt', 'r') as f:
    counts = Counter(just_alnum(w.lower()) for w in f.read().split())
于 2012-07-30T15:36:42.313 に答える
1

文字列で.lower()を使用して、ifブロックの前に小文字に変換し、英数字のみを照合するには、正規表現を試してください。具体的には\wを参照してください。

于 2012-07-30T15:33:31.293 に答える
0
>>>msg = "Hello,World!"
>>>msg = msg.lower() #convert into all lowercase
>>>print msg
hello,world!
>>>msg = filter(lambda x: x.isalpha(), msg) #remove every character that isn't a letter
>>>print msg
helloworld
于 2012-07-30T15:35:08.113 に答える
0

この方法は確かに最適化されているわけではありませんが、堅牢だと思います。

>>> msg = "A   very42 dirty__ string ©."
# Replace all non alphabetical characters (maybe you want isalnum() instead)
>>> msg = map(lambda x: x if x.isalpha() else ' ', msg)
# Concat splitted chars
>>> msg = ''.join(msg)
# Avoid multiple spaces
>>> msg = ' '.join(msg.split())
>>> msg
'A very dirty string'

巨大で異種の入力では、多くのリソースを消費するため、より最適化されたものが必要な場合は、入力ファイルについて知っている制約に従って適応させる必要があります(例:句読点は常にスペースで囲まれていますか? )。

その上、これらすべてのことを1行で行うことができますが、コードの次の読者にとって理解するのは難しいかもしれません...

于 2012-07-30T16:07:19.873 に答える