list [-1] выдает ошибку "list index out of range" в программе на python - PullRequest
1 голос
/ 03 августа 2011

Я пытаюсь создать генератор марков, который принимает произвольную длину для цепочки слов в качестве упражнения на программирование, но я нашел ошибку, которую просто не могу исправить. Когда я запускаю функцию 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)

1 Ответ

7 голосов
/ 03 августа 2011

Если words пусто, то да, это произойдет. Попытка получить доступ к words[-1] в пустом массиве так же недопустима, как и words[0]. Добавьте проверку, чтобы увидеть, если len(words) == 0. Та же логика действует для nextWords, который в этом коде выглядит так, как будто он тоже может быть пустым.

...