分配时 Python 字典键错误 - 我该如何解决这个问题?

问题描述 投票:0回答:6

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

myDict = {}

然后我想在其中添加对应于另一个字典的键,我在其中放入另一个值:

myDict[2000]['hello'] = 50

所以当我经过

myDict[2000]['hello']
某处时,它会给出
50
.

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

python dictionary keyerror
6个回答
40
投票

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

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

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


15
投票

你想要的是实现一个嵌套的字典

我推荐这种方法:

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']

刚刚好。


14
投票

但是你试图阅读一个不存在的条目:

myDict[2000]
.

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.