2016-11-11 11 views
0

私はマルコフ連鎖を使用してランダムな文章生成プログラムを作成しようとしていますが、ファイル内の各単語に続く単語のリストを作成しようとすると問題が発生しています。私が使用しようとしてきたコードは、次のようなファイル内の各単語の後に続くすべての単語のリストを作成するにはどうすればよいですか?

word_list = [spot+1 for spot in words if spot == word] 

私が試してみましたバリエーション、:

TypeError: Can't convert 'int' object to str implicitly 

方法:

word_list = [words[spot+1] for spot in words if spot == word] 

しかし、それぞれの時間が、私はエラーを取得します特定の単語に続くリストに単語を正しく追加できますか?私は、私が考えていない、これに対する鮮明な明らかな解決策があるように感じる。

+0

は、文字列をspot' 'のですか?もしそうなら、あなたはそれに '1 'を加えて何を達成しようとしていますか? – n1c9

+0

スポットは文字列で、リストに続く単語を取得するために1を追加します。 – nalydttirrem

+2

あなたはそれがリストにある場所のインデックスではなく、文字列に1を加えるように指示しているだけです。だから、もし 'word'が複数回出現すると動作しない' word = list = [words [word_list.index(spot)+ 1]をspot == wordの場合は単語の単語に ' – n1c9

答えて

1

トリックではなく、個々の単語よりも、ペアを反復することです:

words = ['the', 'enemy', 'of', 'my', 'enemy', 'is', 'my', 'friend'] 
word = 'my' 

[next_word for this_word, next_word in zip(words, words[1:]) if this_word == word] 

結果:

['enemy', 'friend'] 

このアプローチは、Pythonのzip()機能、およびスライスに依存しています。

>>> list(zip(words, words[1:])) 
[('The', 'enemy'), 
('enemy', 'of'), 
('of', 'my'), 
('my', 'enemy'), 
('enemy', 'is'), 
('is', 'my'), 
('my', 'friend')] 
:あなたはそれで元 wordsを圧縮するとき、あなたはペアのリストを取得するように...

>>> words[1:] 
['enemy', 'of', 'my', 'enemy', 'is', 'my', 'friend'] 

words[1:]

は、最初の1アウトミス wordsのコピーです

これを取得したら、あなたのリストの理解は、最初の単語が探している単語であれば、各ペアの2番目の単語を返すだけです:

word = 'enemy' 

[next_word for this_word, next_word in zip(words, words[1:]) if this_word == word] 

結果:

['of', 'is'] 
関連する問題