我有一个像这样创建的字典:
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()返回的空字典。
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']
只是工作。
但是你正在尝试阅读一个不存在的条目:myDict[2000]
。
你代码中实际上想要做的是“给我带有键为2000的myDict条目,并在该条目中针对键'hello'存储50。”但是myDict没有键为2000的条目,因此出现了错误。
实际上你需要做的是创建那个键。你可以一次性完成:
myDict[2000] = {'hello': 50}
myDict[2000]
中其他键的现有条目。考虑使用defaultdict(dict)
。 - user2357112type 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}}
dict
?还是它是一个原始类型? - carkod