Python 嵌套字典列表
我有3个对象,我正在填充为JSON文件格式。这些对象来自需要展开才能访问的API:Python 嵌套字典列表,python,json,python-2.7,Python,Json,Python 2.7,我有3个对象,我正在填充为JSON文件格式。这些对象来自需要展开才能访问的API: my_dict = {} for elem_a in list_a: for elem_b in elem_a: for elem_c in elem_b: elem_c_info = { "name" : elem_c.prop1, "ID" : elem_c.prop2,
my_dict = {}
for elem_a in list_a:
for elem_b in elem_a:
for elem_c in elem_b:
elem_c_info = {
"name" : elem_c.prop1,
"ID" : elem_c.prop2,
"GPA" : elem_c.prop3
}
my_dict.setdefault("university", {}) \
.setdefault(str(elem_a), {}) \
.setdefault(str(elem_b), {}) \
.setdefault("student", []).append(elem_c_info)
产生如下输出:
{
"university": {
"universityA": {
"class_1": {
"student": [
{
"name": "student_1",
"ID": "1234",
"GPA": "3.8"
},
my_dict = {}
list_result = []
for elem_a in list_a:
elem_a_result = []
for elem_b in elem_a:
elem_b_result = []
for elem_c in elem_b:
elem_b_result.append({
'prop1': elem_c.prop1,
'prop2': elem_c.prop2,
'prop3': elem_c.prop3,
})
elem_a_result.append({
'name': elem_b.name,
'elem_b': elem_b_result,
})
list_result.append({
'name': elem_a.name,
'elem_a': elem_a_result
})
my_dict = {
'list_a': list_result
}
我想要的输出:
{
"university": [{
"name": "universityA",
"class": [{
"name": "class_1",
"student": [{
"name": "student_1",
"ID": "1234",
"GPA": "3.8"
},
{
"name": "student_2",
"ID": "12345",
"GPA": "3.4"
}
]
},
{
"name": "class_2",
"student": [{
"name": "student_3",
"ID": "14",
"GPA": "3.0"
}]
}
]
}]
}
如您所见,我需要在每个级别将每个嵌套字典封装在一个列表中,并且我需要在每个级别添加一个键/值对(最内层除外)。我成功地使用.append处理了最内部的嵌套,但它在更高的层次上不起作用。关于将这些元素添加到数据结构中有什么建议吗?接受一个或两个问题的解决方案
以下是运行简单嵌套循环时输入数据结构的样子(建议归功于@PM_2Ring):
在我上面的例子中:
list_a = [obj_1, obj_2, ..., obj_n]
for elem_a in list_a:
print('A', elem_a.name)
for elem_b in elem_a:
print(' B', elem_b.name)
for elem_c in elem_b:
print(' C', elem_c.prop1, elem_c.prop2, elem_c.prop3)
('A', universityA)
(' B', class_1)
(' C', student_1, 12345, 3.8)
(' B', class_2)
(' C', student_2, 145, 3.6)
('A', universityB)
(' B', class_1)
(' C', student_1, 12345, 3.8)
(' C', student_2, 1235, 3.6)
(' C', student_3, 12345, 3.4)
(' B', class_2)
(' C', student_1, 145, 3.6)
....
elem_a = [universityA, universityB, universityC] # Top tier
elem_b = [universityA.class_1, universityA.class_2, universityA.class_3] # Middle tier with OO property 'name'
elem_c = [universityA.class_1.student_name, universityA.class_1.student_id, universityA.class_1.student_gpa] # bottom tier relationship
我觉得你的方法失败了,因为你试图一次完成所有事情:一个线性赋值是相当不平凡的。考虑一下这样的事情:
{
"university": {
"universityA": {
"class_1": {
"student": [
{
"name": "student_1",
"ID": "1234",
"GPA": "3.8"
},
my_dict = {}
list_result = []
for elem_a in list_a:
elem_a_result = []
for elem_b in elem_a:
elem_b_result = []
for elem_c in elem_b:
elem_b_result.append({
'prop1': elem_c.prop1,
'prop2': elem_c.prop2,
'prop3': elem_c.prop3,
})
elem_a_result.append({
'name': elem_b.name,
'elem_b': elem_b_result,
})
list_result.append({
'name': elem_a.name,
'elem_a': elem_a_result
})
my_dict = {
'list_a': list_result
}
您可以使每个for循环中的代码只在结构的特定级别上工作,而不关心全局
注意:我没有测试这一点,因为我无法访问像您这样格式化的数据(包括属性、迭代等)
经过一段时间的思考,我发现这可以很容易地改写为一个庞大的列表。然而,这是否更具可读性值得怀疑。它看起来更干净,形状类似于目标结构,但它比直接的for-loop版本更复杂
my_dict = {
'list_a': [
{
'name': elem_a.name,
'elem_a': [
{
'name': elem_b.name,
'elem_b': [
{
'prop1': elem_c.prop1,
'prop2': elem_c.prop2,
'prop3': elem_c.prop3,
}
for elem_c in elem_b]
}
for elem_b in elem_a]
}
for elem_a in list_a]
}
我很惊讶你最后的代码工作。elem_a_prop变量未定义。我也不明白你期望的最终结果是什么,我怀疑你需要字典中的扩充列表,而不是字典本身,也就是我的dict['list_a']+={'name':…}@Serge从特定领域的行话翻译成这种广义形式存在一些问题。我会彻底澄清我的意思。如果你提到它的实际str(elem_a.elem_a_prop)@Shawn,你只显示了单个元素的
list_a
的预期输出,你能为多个元素更新它吗?更新的OP消息你真是个救命稻草!!!基于我对域API的快速转换,这正是我想要的。谢谢大家!@肖恩,不客气。我添加了另一个版本。。。以防您喜欢嵌套列表理解。