python中的嵌套词典

python中的嵌套词典,python,dictionary,Python,Dictionary,我是Python新手,我正在尝试用flask构建一个简单的RESTAPI。 我不明白这为什么会导致错误: boxes = {} counter = 1 for box in ListOfBoxes: boxes['boxes'][counter]['ID']= box.ID boxes['boxes'][counter]['name']= box.name boxes['boxes'][counter]['state']= box.state boxes['b

我是Python新手,我正在尝试用flask构建一个简单的RESTAPI。 我不明白这为什么会导致错误:

boxes = {}
counter = 1
for box in ListOfBoxes:

    boxes['boxes'][counter]['ID']= box.ID
    boxes['boxes'][counter]['name']= box.name 
    boxes['boxes'][counter]['state']= box.state
    boxes['boxes'][counter]['directory']= box.directory
    boxes['boxes'][counter]['provider']= box.provider
    counter +=1 

return jsonify(boxes)
虽然这样做有效:

boxes = {}
counter = 1
for box in ListOfBoxes:

    boxes['boxes'] = {}
    boxes['boxes'][counter] = []
    boxes['boxes'][counter].append({'ID': box.ID, 'name':box.name, 'state': box.state, 'directory': box.directory, 'provider': box.provider})
    counter +=1 

return jsonify(boxes)
错误是:

    File "./flask/app.py", 
line 16, in get_boxes boxes['boxes'][counter]['ID']= box.ID KeyError: 'boxes'

当Google和StackOverflow搜索答案时,通常使用第二段代码。至少我从中了解到了这一点

在第一个示例中,您试图访问未初始化的值

box={}
计数器=1
对于框列表中的框:
box['box'][计数器]['ID']=box.ID
这里的
box
是一个空的dict,但是
box['box']
还不存在,您试图访问的任何其他级别也不存在

第二个示例演示如何在尝试使用数据结构中的每个新层之前初始化它

#创建一个新字典,在字典“框”中指定一个键
盒子['box']={}
#创建一个新列表,分配给我们刚刚创建的字典中的一个键
盒子['box'][计数器]=[]
#现在这个列表已经存在,我们可以使用.append()添加到它
box['box'][counter].append({'ID':box.ID,'name':box.name,'state':box.state,'directory':box.directory,'provider':box.provider})

您收到了一个
KeyError
,因为您试图访问一个尚不存在的字典密钥:
box['box']
从未初始化为具有值;因此,它不存在。

在第一个示例中,您试图访问未初始化的值

box={}
计数器=1
对于框列表中的框:
box['box'][计数器]['ID']=box.ID
这里的
box
是一个空的dict,但是
box['box']
还不存在,您试图访问的任何其他级别也不存在

第二个示例演示如何在尝试使用数据结构中的每个新层之前初始化它

#创建一个新字典,在字典“框”中指定一个键
盒子['box']={}
#创建一个新列表,分配给我们刚刚创建的字典中的一个键
盒子['box'][计数器]=[]
#现在这个列表已经存在,我们可以使用.append()添加到它
box['box'][counter].append({'ID':box.ID,'name':box.name,'state':box.state,'directory':box.directory,'provider':box.provider})

您收到了一个
KeyError
,因为您试图访问一个尚不存在的字典密钥:
box['box']
从未初始化为具有值;因此,它是不存在的。

问题是
box
不包含键
'box'
。因为您在这里**不设置
框['box']
,而是获取元素
,并对该元素执行操作

解决此问题的一种方法当然是立即在字典
框中插入具有该键的元素,因此:

boxes = {'boxes':[]}
然而,这仍然不够,因为您再次获取
box['box'][counter]
对该对象执行操作。同样,你必须构建一个字典

但是,您可以使用列表理解和字典文本优雅地重写代码,以:

如果
是一个对象,并且它只包含上面讨论的字段,则您甚至可以使用以下一行:

返回jsonify({'box':[box.\uu dict\uuuuuuuuuuuu for listofBox]})

因为
\uuuu dict\uuuu
是对象的字典(包含映射到其值的字段的名称)。但是这只在上面讨论的条件下有效。

问题是
不包含键
'box'
。因为您在这里**不设置
框['box']
,而是获取元素
,并对该元素执行操作

解决此问题的一种方法当然是立即在字典
框中插入具有该键的元素,因此:

boxes = {'boxes':[]}
然而,这仍然不够,因为您再次获取
box['box'][counter]
对该对象执行操作。同样,你必须构建一个字典

但是,您可以使用列表理解和字典文本优雅地重写代码,以:

如果
是一个对象,并且它只包含上面讨论的字段,则您甚至可以使用以下一行:

返回jsonify({'box':[box.\uu dict\uuuuuuuuuuuu for listofBox]})

因为
\uuuu dict\uuuu
是对象的字典(包含映射到其值的字段的名称)。但这仅在上述条件下有效。

实现默认树的简单方法是使用:

然后:


实现默认树的一种简单方法是使用:

然后:


我得到了同样的答案…;-)我得到了同样的答案…;-)
return jsonify({'boxes':[box.__dict__ for box in ListOfBoxes]})
from collections import defaultdict

def Tree():
    return defaultdict(Tree)
boxes = Tree()

boxes['boxes'][5]['provider']= box.provider