29

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

myDict = {}

然后我喜欢在其中添加与另一个字典相对应的键,在其中放置另一个值:

myDict[2000]['hello'] = 50

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

为什么 Python 不只是在那里创建这些条目?有什么问题?我认为 KeyError 仅在您尝试读取不存在的条目时发生,但我在这里创建它?

4

5 回答 5

39

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

>>> from collections import defaultdict
>>> myDict = defaultdict(dict)
>>> myDict[2000]['hello'] = 50
>>> myDict[2000]
{'hello': 50}

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

于 2014-06-06T19:45:22.250 回答
13

但是您正在尝试读取一个不存在的条目:myDict[2000].

您在代码中所说的确切翻译是“给我 myDict 中的条目,键为 2000,并针对该条目中的键‘hello’存储 50。” 但是 myDict 没有 2000 的键,因此出现错误。

您实际需要做的是创建该密钥。你可以一口气做到这一点:

myDict[2000] = {'hello': 50}
于 2014-06-06T19:35:44.260 回答
9

你想要的是实现一个嵌套的 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']

只是工作。

于 2014-06-06T19:50:38.170 回答
3

根据下面的场景,当你追加type new_resultdict,你会得到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)
于 2021-03-12T08:03:49.863 回答
2

你是对的,但在你的代码中,python 必须首先获取 myDict[2000] 然后进行分配。由于该条目不存在,因此无法分配给其元素

于 2014-06-06T19:36:56.893 回答