python - 使用值列表从字典中打印随机值的 python keyerror 故障排除

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

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

在此函数中,我在 w1, w2 = w2, random.choice(self.wordlog[w1]) 行中不断收到 Keyerror

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

最佳答案

我认为这是因为您使用的是 random.choicedict 而不是 list/set/元组
这很难说,但也许你应该检查一下 self.wordlog 来确定一下。

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

[编辑] 也许只是在尝试满足给定的 gensize 时遇到了不存在的 key 。

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

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

方法 1

检查单词日志中的w1else:break
此方法可能会提供小于所要求的gensize的解决方案。

方法 2

确保它适用于给定gensizeANY
您可以轻松地在循环中链接单词日志键和值来做到这一点,
就像 {'a':['b','a'],'b':['b','a']}

关于python - 使用值列表从字典中打印随机值的 python keyerror 故障排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30787526/

相关文章:

python - Python 中 dicT 的简单问题

redis - G-WAN 和 C 中的键值存储

nosql - 支持对任何给定属性进行查询的 DynamoDB 模型

python - 如何打印单独的行并转换为字符串?

python - OpenCV 从 url 加载视频

list - 在 Dart 中, `List.unmodifiable` 是创建一个不可修改的 View ,还是一个全新的独立列表?

Python:有效计算字典列表中键的唯一值的数量

.NET - 一种快速的轻量级持久键值存储

python - 读取文件最多一个字符

python - PUT 图片上传请求在 django rest 中不起作用