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()返回的是一个空字典.
但是,你正在试图读取并不存在的条目:myDict[2000].
您在代码中所说的内容的确切翻译是"在myDict中输入密钥为2000的条目,并在该条目中将密钥'hello'存储为50." 但myDict没有2000的密钥,因此错误.
您实际需要做的是创建该密钥.你可以一气呵成:
myDict[2000] = {'hello': 50}
Run Code Online (Sandbox Code Playgroud)
您想要实现一个嵌套的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)
正常工作。
| 归档时间: |
|
| 查看次数: |
22432 次 |
| 最近记录: |