-1

次のテキストがあります:sherlock.txt そして、その中のすべての単語のリストを作成したいと思います(句読点は単語の一部であるため、「glad。」などの区切り要素ではありません)。私がしたことは次のとおりでした:

>>> def wordlist(text):
...    input= open(text,'r')
...    data= input.read()
...    input.close()
...    data=data.replace('\n',' ')
...    data=data.replace(chr(13),' ')
...    data=data.replace(chr(9),' ')
...    data=data.split(' ')
...    while '' in data:
...        data.remove('')
...    return data

問題は、単語のリストを返すことですが、約1時間かかります。そうするために7秒。これを行うためのより速い方法はありますか?ここではwhileループが問題であることを知っています。

4

5 に答える 5

7

これはそれをしていませんでしたか?引数なしで呼び出すsplitと、すべての空白文字の文字列が分割され''、データの一部と見なされる前に問題を引き起こしていた文字列が排除されます。これらの他の空白文字をに変更するのは面倒なので' '、組み込みのデフォルトの動作で同じ効果を無料で得ることもできます。

def wordlist(text):
    with open(text, "r") as fp:
        data = fp.read().split()
    return data
于 2012-12-11T16:47:46.630 に答える
0

はい、文字列を分割することができます。

data.split()

これは空白で分割され、配列を返します。

分割のドキュメント。

于 2012-12-11T16:48:45.083 に答える
0

私は以下があなたが探していることをすることを信じます:

words = list(itertools.chain(*map(str.split, open('sherlock.txt'))))

私のマシンでは、これには16.5msかかります。

の呼び出しを削除することlist()で、すべての単語をメモリに保存する代わりに、単語を読み取るときに単語を返すジェネレータに変換できます。

以下は、より単純で高速ですが、メモリ効率が低くなります(これは、入力ファイルが大きい場合に問題になる可能性があります)。

words = open('sherlock.txt').read().split()

これには約6.7msかかります。

于 2012-12-11T16:51:30.707 に答える
0

split()引数なしで関数を使用してみてください。空白で分割されるreplaceため、最初に-ingを実行する必要はありません。

def wordlist(text):
...    input= open(text,'r')
...    data= input.read().split()
...    input.close()
...    return data
于 2012-12-11T16:52:07.747 に答える
0

議論のために、入力から空白の文字列を取得できないと仮定します。明らかに、それができるのであれば、それが好ましい方法です。リスト内包表記は、それ以外の場合はそれらを削除できます。

data = [word for word in data if word]

if空の文字列はに評価されるため、この部分は単純化されていFalseます。

于 2012-12-11T17:07:00.040 に答える