2

文字列を単語に分割し、次のように連続する各単語をペアで結合する必要があります。

"This is my subject string"  

次の場所に移動します。

"This is"    
"is my"  
"my subject"  
"subject string" 

文字列は、5 語から 250 語の範囲です。また、1GB程度の大量のデータでこれを行うことになります。Pythonでこれを行う効率的な方法はありますか?

どの方法が最も効率的かについて多くのアドバイスを見てきましたので、最初に質問したいと思いました。

4

6 に答える 6

1

これはPythonicの方法です

from itertools import izip
[' '.join(pair) for pair in izip(words[:-1], words[1:])]

izipは多かれ少なかれ効率を維持します

于 2013-04-20T23:19:03.927 に答える
1
>>> import re
>>> text = "This is my subject string"
>>> re.findall(r'(\w+)\s+(?=(\w+))', text)
[('This', 'is'), ('is', 'my'), ('my', 'subject'), ('subject', 'string')]

これからジェネレーターが必要な場合は、使用してくださいre.finditer

pairs = (m.groups() for m in re.finditer(r'(\w+)\s+(?=(\w+))', text))

これは非常に高速で効率的です。すべての単語を一度にメモリに保存しないため、2 番目のバージョンが最も効率的ですが、それほど高速ではありません。提案された方法をプロファイリングして、どれがあなたに適しているかを確認する必要があります.

于 2013-04-21T00:41:58.523 に答える
0

この場合、各文字列が小さい (1GB ではない) と仮定すると、素朴な実装は問題なく動作するはずです。

string = "This is my subject string"

words = string.split()
prevWord = None

for word in words:
    if prevWord != None:
        print prevWord, word
    prevWord = word

かなり大きなデータセットを扱うときはいつものように、1 つの項目を読み取り、それを処理し、次の項目を読み取りsplit()ます。ファイル全体を読み取ろうとしないでください。

于 2013-04-20T23:19:12.127 に答える