故障排除python keyerror打印带有值列表的字典中的随机值

时间:2015-06-11 17:28:28

标签: python dictionary key-value-store markov-chains

我试图制作马尔可夫文本生成器,但我不断得到一个我不明白的KeyError

在此功能中,我在Keyerror行中不断获得w1, w2 = w2, random.choice(self.wordlog[w1])

self.gensize是我想要生成的字数,

self.size是我文字中的字词总数

self.wordlog是字典 - 即{'secondly': ['because', 'because'], 'pardon': ['cried', 'cried', 'said', 'said', 'your', 'she'], 'limited': ['to', 'warranty', 'right', 'right', 'to'], etc...}

def generate(self):
    startseed = random.randint(0, self.size - 1)
    w1, w2 = self.words[startseed], self.words[startseed+1]
    #at this point, w1 and w2 are a random word and a following word-i.e. alice ran
    wordlist = [] 
    for i in range(self.gensize):
        wordlist.append(w1)
        w1, w2 = w2, random.choice(self.wordlog[w1])
    #i.e. self.wordlog[alice] should return a list of all the values the word alice precedes
    wordlist.append(w2)
    print wordlist

当我运行函数(print markov("alice.txt", 5).generate())时,我只是不断得到一个KeyError - 每次都是一个不同的单词(这是预期的,因为起始种子和random.choice会导致对此)。

任何人都知道这有什么问题以及如何解决这个问题?

编辑:

这是代码的其余部分,因此您可以看到self.words以及其他所有内容的来源:

class markov(object):
    def __init__(self, filename, gensize):
        self.wordlog = {}
        self.filename = filename
        self.words = self.file_to_words()
        self.size = len(self.words)
        self.gensize = gensize

    def file_to_words(self):
        with open(self.filename, "r") as file_opened:
            text = file_opened.read().translate(None, string.punctuation)
            mixedcasewords = text.split()
            words = [x.lower() for x in mixedcasewords]
            return words

    def doubles(self):
        for i in range((self.size)-1):
            yield (self.words[i], self.words[i+1])       

    def catalog(self):
        for w1, w2 in self.doubles():
            self.wordlog.setdefault(w1, []).append(w2)
        print self.wordlog

1 个答案:

答案 0 :(得分:1)

我认为这是因为您使用random.choicedict代替list / set / tuple 很难说,但也许你应该检查self.wordlog以确保。

for k,v in self.wordlog.items():
    if type(v) != list: print("This shouldn't happen! Check: '"+k+"'")

[编辑] 也许只是在尝试实现给定的 gensize 达到一个不存在的密钥时。

print markov("alice.txt", 5).generate()

以五次迭代启动for循环。对于每次迭代,您应确保随机选择的密钥w1实际上是wordlog的密钥。
为了确保这不是问题,您可以做两件事:

方法1

检查w1 in wordlogelse: break
这种方法可能会提供比所要求的 gensize 更小的解决方案。

方法2

确保任意适用于 gensize
您可以轻松地将循环中的wordlog键和值链接起来 比如{'a':['b','a'],'b':['b','a']}