Python字典在赋值时出现键错误 - 我该如何解决?

37

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

myDict = {}

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

myDict[2000]['hello'] = 50

因此,当我将 myDict[2000]['hello'] 传递到某个地方时,它会给出 50

为什么Python不在那里创建这些条目呢?问题在哪里?我以为只有在尝试读取不存在的条目时才会出现KeyError,但是我在这里创建它了吗?

6个回答

42

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

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

defaultdict(dict)指当myDict遇到未知的键时,它将返回一个默认值。在这种情况下,它会返回一个由dict()返回的空字典。


1
你在哪里定义了 dict?还是它是一个原始类型? - carkod
1
是的,dict是内置类型。 - OldGeeksGuide

16
你想要实现的是一个嵌套字典
我建议采用以下方法:
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']

只是工作。


这是一个被低估的答案... - chakrr

14

但是你正在尝试阅读一个不存在的条目:myDict[2000]

你代码中实际上想要做的是“给我带有键为2000的myDict条目,并在该条目中针对键'hello'存储50。”但是myDict没有键为2000的条目,因此出现了错误。

实际上你需要做的是创建那个键。你可以一次性完成:

myDict[2000] = {'hello': 50}

6
这会删除myDict[2000]中其他键的现有条目。考虑使用defaultdict(dict) - user2357112

4
根据以下情况,当您将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)

2

你说得没错,但是在你的代码中,Python 首先要获取 myDict[2000],然后再进行赋值。由于该条目不存在,因此无法对其元素进行赋值。


0

另一个解决方案可能是初始化字典项,并为外部键值分配一个空字典项。例如,一旦您初始化了分配字典,就可以使用嵌套循环分配值。

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}}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接