Skip to main content
 首页 » 编程设计

python之list[-1] 在 python 程序中产生 "list index out of range"错误

2025年05月04日14shangdawei

作为编程练习,我正在尝试构建一个采用任意长度的词链的马尔可夫生成器,但我发现了一个我似乎无法完全修复的错误。当我运行 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) 

请您参考如下方法:

如果 words 为空,那么会发生这种情况。尝试访问空数组中的 words[-1] 与 words[0] 一样无效。添加检查以查看是否 len(words) == 0。同样的逻辑也适用于 nextWords,它在这段代码中看起来也可能是空的。