分配时Python字典键错误 - 我该如何解决这个问题?

ula*_*ade 17 python dictionary keyerror

我有一个我这样创建的字典:

myDict = {}
Run Code Online (Sandbox Code Playgroud)

然后我想在其中添加与另一个字典对应的键,其中我放了另一个值:

myDict[2000]['hello'] = 50
Run Code Online (Sandbox Code Playgroud)

所以,当我经过myDict[2000]['hello']某个地方时,它会给予50.

为什么Python不只是在那里创建这些条目?有什么问题?我认为只有当你尝试读取一个不存在的条目时才会出现KeyError,但我正在这里创建它?

Old*_*ide 25

KeyError发生的原因是您尝试访问时尝试读取不存在的密钥myDict[2000].作为替代方案,您可以使用defaultdict:

>>> from collections import defaultdict
>>> myDict = defaultdict(dict)
>>> myDict[2000]['hello'] = 50
>>> myDict[2000]
{'hello': 50}
Run Code Online (Sandbox Code Playgroud)

defaultdict(dict) 意味着如果myDict遇到一个未知的密钥,它将返回一个默认值,在这种情况下,dict()返回的是一个空字典.

  • 你在哪里定义了“dict”?或者说是一个原始的? (2认同)

Dan*_*man 7

但是,你正在试图读取并不存在的条目:myDict[2000].

您在代码中所说的内容的确切翻译是"在myDict中输入密钥为2000的条目,并在该条目中将密钥'hello'存储为50." 但myDict没有2000的密钥,因此错误.

您实际需要做的是创建该密钥.你可以一气呵成:

myDict[2000] = {'hello': 50}
Run Code Online (Sandbox Code Playgroud)

  • 但是,这将丢弃`myDict [2000]中其他键的任何现有条目.`defaultdict(dict)`可能值得考虑. (4认同)

Aar*_*all 5

您想要实现一个嵌套的dict:

我推荐这种方法:

class Vividict(dict):
    def __missing__(self, key):
        value = self[key] = type(self)()
        return value
Run Code Online (Sandbox Code Playgroud)

从文档下 d[key]

2.5版中的新增功能:如果dict的子类定义了一个方法 __missing__(),如果键key不存在,则d [key]操作以键key作为参数调用该方法

尝试一下:

myDict = Vividict()

myDict[2000]['hello'] = 50
Run Code Online (Sandbox Code Playgroud)

并且myDict现在返回:

{2000: {'hello': 50}}
Run Code Online (Sandbox Code Playgroud)

这将适用于您想要的任意深度:

myDict['foo']['bar']['baz']['quux']
Run Code Online (Sandbox Code Playgroud)

正常工作。