我有一本这样创建的字典:
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() 返回什么,它都是一个空字典。
你想要的是实现一个嵌套的字典:
我推荐这种方法:
class Vividict(dict):
def __missing__(self, key):
value = self[key] = type(self)()
return value
来自文档,在
d[key]
下
,如果键__missing__()
不存在,则 d[key] 操作以键 key 作为参数调用该方法key
试一试:
myDict = Vividict()
myDict[2000]['hello'] = 50
myDict 现在返回:
{2000: {'hello': 50}}
这将适用于您想要的任意深度:
myDict['foo']['bar']['baz']['quux']
刚刚好。
但是你试图阅读一个不存在的条目:
myDict[2000]
.
您在代码中所说的内容的确切翻译是“给我 myDict 中的条目,键为 2000,并针对该条目中的键 'hello' 存储 50。”但是 myDict 没有 2000 的密钥,因此出现错误。
您实际需要做的是创建该密钥。你可以一次性做到这一点:
myDict[2000] = {'hello': 50}
根据以下场景,当您将
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] 然后进行分配。由于该条目不存在,因此无法分配给它的元素
另一个解决方案可能是初始化一个字典项,并为外部键值分配一个空的字典项。例如,您可以在初始化赋值字典后使用嵌套循环赋值。
myDict={}
counter=0
for outerKey in ['a','b']:
myDict[outerKey]={} # initialize a dict whose elements are dictionary
for innerKey in ['c','d']:
counter+=1
myDict[outerKey][innerKey]=counter # assign using key values
print(myDict)
产出率:
{'a': {'c': 1, 'd': 2}, 'b': {'c': 3, 'd': 4}}