【问题标题】:python generating nested dictionary key errorpython生成嵌套字典键错误
【发布时间】:2013-12-05 20:29:46
【问题描述】:

我正在尝试从 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) 的整数吗?为什么不使用列表?
  • 如果您不想在result 中使用'data',为什么还要使用它?
  • 您应该在文档中查找字典
  • @KEYSER 使用 OP 很容易,这是任何初学者假设平面 dict 分配会创建嵌套 dict 的典型假设错误。如果每个人都需要从文档中学习(我们没有提到),那么为什么是 SOF ;)

标签: python dictionary


【解决方案1】:

你想创建一个嵌套字典

result = {} 将为平面字典创建分配,其项目可以具有任何值,例如“string”、“int”、“list”或“dict”

对于这个平面作业

python知道为result["first"]做什么

如果你想让“first”也成为另一本字典,你需要通过一个 assingment 告诉 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'

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:

      result['data'] 确实存在。所以你不能向它添加数据。

      从一开始就试试这个:

      result = {'data': []};
      

      【讨论】:

        【解决方案4】:

        您必须先创建密钥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 当然可以。
        猜你喜欢
        • 1970-01-01
        • 2014-03-30
        • 2020-05-14
        • 2018-08-01
        • 2021-05-10
        • 2021-10-08
        • 1970-01-01
        • 2019-05-09
        • 1970-01-01
        相关资源
        最近更新 更多