Python 生成嵌套字典键错误

3
我正在尝试从MySQL查询中创建一个嵌套字典,但是我遇到了键错误。
result = {}

for i, q in enumerate(query):

    result['data'][i]['firstName'] = q.first_name
    result['data'][i]['lastName'] = q.last_name
    result['data'][i]['email'] = q.email

错误

KeyError: 'data'

期望的结果

result = {
    'data': {
        0: {'firstName': ''...}
        1: {'firstName': ''...}
        2: {'firstName': ''...}
    }
}

你想让键为从0到len(result)的整数吗?为什么不使用列表呢? - jpwagner
如果你不想在result中包含它,为什么要使用'data' - Lev Levitsky
1
你应该在文档中查找字典。 - keyser
@KEYSER 对OP要友善,这是任何初学者都容易犯的典型假设错误,即假设平面字典赋值会创建嵌套字典。如果每个人都需要从文档中学习(我们没有参考),那么为什么还有SOF ;) - user2390183
可能是Python中初始化字典的最佳方法是什么?的重复问题。 - timfeirg
4个回答

10

您想要创建一个嵌套字典

result = {} 会创建一个扁平的字典赋值,其条目可以有任何值,如 "string"、"int"、"list" 或 "dict"

对于这个扁平的赋值

Python 知道如何处理 result["first"]

如果您想让 "first" 也成为另一个字典,您需要通过一个赋值告诉 Python: result['first'] = {}.

否则,Python 会引发 "KeyError"

我认为这就是您所寻找的 :)

>>> from collections import defaultdict
>>> mydict = lambda: defaultdict(mydict)
>>> result = mydict()
>>> result['Python']['rules']['the world'] = "Yes I Agree"
>>> result['Python']['rules']['the world']
'Yes I Agree'

1
result = {}
result['data'] = {}

for i, q in enumerate(query):
    result['data']['i'] = {}
    result['data'][i]['firstName'] = q.first_name
    result['data'][i]['lastName'] = q.last_name
    result['data'][i]['email'] = q.email

或者,您可以使用自己的类,该类会自动添加额外的字典。

class AutoDict(dict):
    def __missing__(self, k):
        self[k] = AutoDict()
        return self[k]

result = AutoDict()

for i, q in enumerate(query):
    result['data'][i]['firstName'] = q.first_name
    result['data'][i]['lastName'] = q.last_name
    result['data'][i]['email'] = q.email

0
你必须先创建键 data
result = {}
result['data'] = {}

for i, q in enumerate(query):
    result['data'][i] = {}
    result['data'][i]['firstName'] = q.first_name
    result['data'][i]['lastName'] = q.last_name
    result['data'][i]['email'] = q.email

我认为 result['data']['i'] = {} 应该改为 result['data'][i] = {} - SethMMorton
@SethMMorton 当然可以。 - Hyperboreus

0

result['data'] 存在。因此您无法向其添加数据。

请在开头尝试以下内容:

result = {'data': []};

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