2 回答

TA贡献1868条经验 获得超4个赞
溶液
您可以使用 和 :collections.defaultdictdict.setdefault
from collections import defaultdict
nested_list = [
{
"id": "fruit",
"name": "apple"
},
{
"name": "fruit"
},
{
"id": "fruit",
"name": "grape"
},
{
"id": "fruit",
"name": "pineapple"
},
{
"name": "vehicle"
},
{
"id": "vehicle",
"name": "car"
},
{
"id": "car",
"name": "sedan"
},
{
"id": "sedan",
"name": "mini sedan"
},
]
working_dict = defaultdict(dict)
result_dict = {}
for item in nested_list:
name = item['name']
if 'id' in item:
id_ = item['id']
working_dict[id_].setdefault(name, working_dict[name])
else:
result_dict[name] = working_dict[name]
print(working_dict)
print(result_dict)
输出:
defaultdict(<class 'dict'>, {'fruit': {'apple': {}, 'grape': {}, 'pineapple': {}}, 'apple': {}, 'grape': {}, 'pineapple': {}, 'vehicle': {'car': {'sedan': {'mini sedan': {}}}}, 'car': {'sedan': {'mini sedan': {}}}, 'sedan': {'mini sedan': {}}, 'mini sedan': {}})
{'fruit': {'apple': {}, 'grape': {}, 'pineapple': {}}, 'vehicle': {'car': {'sedan': {'mini sedan': {}}}}}
解释
这个想法:是可变的。
dict
working_dict
是所有 s 的参考表。"id"
如果没有这样的ID,请注册。
{}
并注册没有字段的元素,作为根元素进入.
id
result_dict
附加
如果不想使用 ,则只能使用 。但它更冗长。collections.defaultdict
dict.setdefault
working_dict = {}
result_dict = {}
for item in nested_list:
name = item['name']
if 'id' in item:
id_ = item['id']
working_dict.setdefault(id_, {}).setdefault(name, working_dict.setdefault(name, {}))
else:
result_dict[name] = working_dict.setdefault(name, {})
print(result_dict)

TA贡献2003条经验 获得超2个赞
您也可以使用递归函数手动执行此操作。理念:
循环访问输入列表中的元素
忽略不带键的元素
id
对于带有 in 键的元素:
id
在输出中递归搜索此键
添加 元素(如果元素已经存在,则元素将添加到递归函数中,否则在之后)。
# Recursive search
def iterdictAdd(d, id, name):
# For all element in the dict
for k, v in d.items():
# If key match -> add
if k == id:
d[id] = {**d[id], **{name: {}}}
return True
else:
# Recursive call
if isinstance(v, dict):
if iterdictAdd(v, id, name):
return True
return False
out = {}
# Iterate all dict
for dict_ in nested_list:
# Ignore elements without "id"
if "id" in dict_:
# Search and add this key
if not iterdictAdd(out, dict_["id"], dict_["name"]):
out[dict_["id"]] = {dict_["name"]: {}}
print(out)
# {'fruit': {
# 'apple': {},
# 'grape': {},
# 'pineapple': {}
# },
# 'vehicle': {
# 'car': {
# 'sedan': {}
# }
# }
# }
添加回答
举报