2016-11-11 96 views
0

我試圖建立一個使用馬爾科夫鏈的隨機語句生成器,但當試圖建立一個文件中的每個單詞後面的單詞列表時遇到問題。我一直在試圖使用的代碼是:如何建立文件中每個單詞之後的所有單詞列表?

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

我曾嘗試變化,如:

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

但每次,我得到的錯誤:

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

如何我能否正確地將單詞添加到給定單詞後面的列表中?我覺得有一個明顯的解決方案,這是我沒有想到的。

+0

是'spot'一個字符串?如果是這樣,你想通過加1來完成什麼? – n1c9

+0

Spot是一個字符串,我將它加1以獲得它在列表中的單詞。 – nalydttirrem

+2

你只是告訴它在字符串中加1,而不是它在列表中的索引。所以如果單詞出現不止一次,那麼你必須編寫'word_list = [words [word_list.index(spot)+ 1] for word in word in word if word == 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()功能,和切片。

words[1:]words一個副本遺漏了第一個:

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

...所以,當你壓縮的原始words有了它,你會得到對的列表:

>>> list(zip(words, words[1:])) 
[('The', 'enemy'), 
('enemy', 'of'), 
('of', 'my'), 
('my', 'enemy'), 
('enemy', 'is'), 
('is', 'my'), 
('my', 'friend')] 

一旦你有了這個,你的列表理解只需要返回每一對中的第二個單詞,如果第一個單詞是你正在尋找的第一個單詞:

word = 'enemy' 

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

結果:

['of', 'is'] 
相關問題