[英]Nested lists of dictionaries
我有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,
"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"
},
我想要的輸出:
{
"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
我覺得你的方法失敗了,因為你試圖一次完成所有事情:單行任務是非常重要的。 請考慮這樣的事情:
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]
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.