我有一个这样创建的字典:
myDict = {}
然后我喜欢在其中添加与另一个字典相对应的键,在其中放置另一个值:
myDict[2000]['hello'] = 50
所以当我经过myDict[2000]['hello']
某个地方时,它会给出50
.
为什么 Python 不只是在那里创建这些条目?有什么问题?我认为 KeyError 仅在您尝试读取不存在的条目时发生,但我在这里创建它?
我有一个这样创建的字典:
myDict = {}
然后我喜欢在其中添加与另一个字典相对应的键,在其中放置另一个值:
myDict[2000]['hello'] = 50
所以当我经过myDict[2000]['hello']
某个地方时,它会给出50
.
为什么 Python 不只是在那里创建这些条目?有什么问题?我认为 KeyError 仅在您尝试读取不存在的条目时发生,但我在这里创建它?
KeyError
发生是因为您在尝试访问时尝试读取不存在的密钥myDict[2000]
。作为替代方案,您可以使用defaultdict:
>>> from collections import defaultdict
>>> myDict = defaultdict(dict)
>>> myDict[2000]['hello'] = 50
>>> myDict[2000]
{'hello': 50}
defaultdict(dict)
意味着如果 myDict 遇到未知键,它将返回一个默认值,在这种情况下,dict() 返回的是一个空字典。
但是您正在尝试读取一个不存在的条目:myDict[2000]
.
您在代码中所说的确切翻译是“给我 myDict 中的条目,键为 2000,并针对该条目中的键‘hello’存储 50。” 但是 myDict 没有 2000 的键,因此出现错误。
您实际需要做的是创建该密钥。你可以一口气做到这一点:
myDict[2000] = {'hello': 50}
你想要的是实现一个嵌套的 dict:
我推荐这种方法:
class Vividict(dict):
def __missing__(self, key):
value = self[key] = type(self)()
return value
从文档中,在d[key]
2.5 版新功能:如果 dict 的子类定义了一个方法
__missing__()
,如果键key
不存在,则 d[key] 操作以键 key 作为参数调用该方法
尝试一下:
myDict = Vividict()
myDict[2000]['hello'] = 50
myDict 现在返回:
{2000: {'hello': 50}}
这适用于您想要的任意深度:
myDict['foo']['bar']['baz']['quux']
只是工作。
根据下面的场景,当你追加type new_result
到dict
,你会得到KeyError: 'result'
dict = {}
new_result = {'key1':'new_value1','key2':'new_value'}
dict['result'].append(new_result)
因为键不存在,换句话说,您dict
没有结果键。我用defaultdict
他们的setdefault
方法解决了这个问题。
试试看;
from collections import defaultdict
dict = defaultdict(dict)
new_result = {'key1':'new_value1','key2':'new_value2'}
dict.setdefault('result', []).append(new_result)
你是对的,但在你的代码中,python 必须首先获取 myDict[2000] 然后进行分配。由于该条目不存在,因此无法分配给其元素