MYYA
溶液您可以使用 和 :collections.defaultdictdict.setdefaultfrom collections import defaultdictnested_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': {}}}}}解释这个想法:是可变的。dictworking_dict是所有 s 的参考表。"id"如果没有这样的ID,请注册。{}并注册没有字段的元素,作为根元素进入.idresult_dict附加如果不想使用 ,则只能使用 。但它更冗长。collections.defaultdictdict.setdefaultworking_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)
湖上湖
您也可以使用递归函数手动执行此操作。理念:循环访问输入列表中的元素忽略不带键的元素id对于带有 in 键的元素:id在输出中递归搜索此键添加 元素(如果元素已经存在,则元素将添加到递归函数中,否则在之后)。# Recursive searchdef 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 Falseout = {}# Iterate all dictfor 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': {}# }# }# }