Я пытаюсь создать генератор марков, который принимает произвольную длину для цепочки слов в качестве упражнения на программирование, но я нашел ошибку, которую просто не могу исправить. Когда я запускаю функцию markov, я получаю индекс списка вне диапазона.
У меня такое чувство, что я упускаю что-то очевидное, но я не уверен, что. В трассировке говорится, что ошибка в строке 41, с words[-1] = nextWords[random.randint(0, len(nextWords)-1)]
.
Полный код приведен ниже, извините, если отступы испорчены.
#! /usr/bin/python
# To change this template, choose Tools | Templates
# and open the template in the editor.
import random
class Markov(object):
def __init__(self, open_file):
self.cache = {}
self.open_file = open_file
open_file.seek(0)
self.wordlist = open_file.read().split()
def get_random_list(self, length):
i = random.randint(0, len(self.wordlist) - (length - 1))
result = self.wordlist[i:i + length]
return result
def find_next_word(self, words):
candidates = []
for i in range(len(self.wordlist) - len(words)):
if self.wordlist[i:i + len(words)] == words and self.wordlist[i+len(words)+1] not in candidates:
candidates.append(self.wordlist[i+len(words)+1])
return candidates
def markov(self, length=20, chainlength=2):
gibberish = []
words = self.get_random_list(chainlength)
for i in range(len(words)-1):
gibberish.append(words[i])
while len(gibberish) < length:
#find candidate for next word
nextWords = self.find_next_word(words)
gibberish.append(words[-1])
for i in range(len(words)):
try:
words[i] = words[i+1]
except:
pass
words[-1] = nextWords[random.randint(0, len(nextWords)-1)]
return " ".join(gibberish)