我嘗試并看到了上述問題的多種解決方案,但找不到適合我情況的解決方案。我有以下字典串列。
[
{"id": "101", "logical_section": "ORGANIZATION", "parent_section_id": None},
{"id": "102", "logical_section": "ORG_NAMES", "parent_section_id": "101"},
{"id": "103", "logical_section": "ORG_ADDRESSES", "parent_section_id": "101"},
{"id": "104", "logical_section": "SOURCEADDRESS", "parent_section_id": "103"},
{"id": "105", "logical_section": "STANDARDIZEDADDRESS", "parent_section_id": "103"},
{"id": "106", "logical_section": "ORG_EMPLOYES", "parent_section_id": "101"}
]
我需要通過以下方式將此串列轉換為嵌套字典串列
{
"id": "101",
"logical_section": "ORGANIZATION",
"parent_section_id": None,
"child": [
{
"id": "102",
"logical_section": "ORG_NAMES",
"parent_section_id": "101"
},
{
"id": "103",
"logical_section": "ORG_ADDRESSES",
"parent_section_id": "101",
"child": [
{"id": "104", "logical_section": "SOURCEADDRESS", "parent_section_id": "103"},
{"id": "105", "logical_section": "STANDARDIZEDADDRESS", "parent_section_id": "103"}
]
},
{
"id": "106",
"logical_section": "ORG_EMPLOYES",
"parent_section_id": "101"}
]
}
我嘗試過的解決方案如下
levels = dict()
for n in test:
levels.setdefault(n['parent_section_id'], []).append(n)
但這并沒有給出我正在尋找的輸出。
任何幫助,將不勝感激。
uj5u.com熱心網友回復:
我看了一下這個并想出了以下代碼。我絕對肯定這可以做得更好:我不建議將其用于大量資料。如果另一位更有經驗的程式員可以參與此解決方案,我將不勝感激。
test = [
{"id": "101", "logical_section": "ORGANIZATION", "parent_section_id": None},
{"id": "102", "logical_section": "ORG_NAMES", "parent_section_id": "101"},
{"id": "103", "logical_section": "ORG_ADDRESSES", "parent_section_id": "101"},
{"id": "104", "logical_section": "SOURCEADDRESS", "parent_section_id": "103"},
{"id": "105", "logical_section": "STANDARDIZEDADDRESS", "parent_section_id": "103"},
{"id": "106", "logical_section": "ORG_EMPLOYES", "parent_section_id": "101"}
]
ans_dict = test[0]
def insert(tree, node):
if node["parent_section_id"] == tree["id"]:
if "child" not in tree:
tree["child"] = [node]
else:
tree["child"].append(node)
elif "child" in tree:
for c in tree["child"]:
insert(c, node)
for record in test:
insert(ans_dict, record)
print(ans_dict)
此代碼使用遞回二叉樹方法。使它如此低效的原因是,每個節點都insert()使用給定節點作為引數運行函式,每次插入新節點。
uj5u.com熱心網友回復:
這種方法使用廣度優先搜索演算法來構造一棵樹。請注意,由于字典是可變的,因此輸入串列中的所有元素都將被修改。您需要選擇“parent_section_id”為 None 的一個/s 來查找所有父母。
test = [
{"id": "101", "logical_section": "ORGANIZATION", "parent_section_id": None},
{"id": "102", "logical_section": "ORG_NAMES", "parent_section_id": "101"},
{"id": "103", "logical_section": "ORG_ADDRESSES", "parent_section_id": "101"},
{"id": "104", "logical_section": "SOURCEADDRESS", "parent_section_id": "103"},
{"id": "105", "logical_section": "STANDARDIZEDADDRESS", "parent_section_id": "103"},
{"id": "106", "logical_section": "ORG_EMPLOYES", "parent_section_id": "101"}
]
# No assumption about the position of the parent
nodes = [i for i in test if i["parent_section_id"] is None]
# Single parent
parent_idx = test.index(nodes[0])
# If more than 1 parent, then uncomment
#parent_idxs = [test.index(node) for node in nodes]
# Find all children
parent_id_vals = set([d["parent_section_id"] for d in test if d["parent_section_id"] is not None])
while nodes:
focus_node = nodes[0]
if focus_node["id"] in parent_id_vals:
focus_node["child"] = []
# Uncomment else clause if "test" is too large
#else:
# nodes.remove(focus_node)
# continue
for i in test:
if i["parent_section_id"] == focus_node["id"]:
focus_node["child"].append(i)
nodes.append(i)
nodes.remove(focus_node)
# If single parent node
ans = test[parent_idx]
# If multiple parents, then uncomment
#ans = [test[idx] for idx in parent_idxs]
print(ans)
我把它作為一個小挑戰來做。DCoxshall 的答案無論如何都適合您的需求。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/488141.html
下一篇:使用字典的鍵和值進行迭代
