如何将Python中的嵌套列表结构转换为指定图结构的字典
问题分析与解决方法
首先要明确:你给出的原始example存在Python语法错误,无法直接运行,需要先修正为合法结构:
['g': 'h']是非法写法,应改为字典{'g': 'h'};- 外层用大括号包裹列表会创建集合,但集合不能包含列表(不可哈希),所以外层需改为列表;
{'e', 'f'}是集合而非键值对结构,推测你想要的是字典{'e': 'f'}。
修正后的合法输入示例:
example = [ {'g': 'h'}, [ {'a': 'b'}, {'c': 'd'}, {'a': 'b'}, {'e': 'f'} ] ]
接下来实现你需要的图结构转换逻辑:核心是合并相同前缀路径,将后续节点挂载到对应路径下,同时保留顶级独立节点。
实现代码
def build_graph(input_data): result = {} def process_path(path_list): current_nodes = {} prev_key = None prev_node = None for item in path_list: if not isinstance(item, dict) or len(item) != 1: continue key, val = next(iter(item.items())) if prev_key is None: if key not in current_nodes: current_nodes[key] = {} prev_node = current_nodes[key] prev_key = val else: if prev_key == key: prev_node[val] = {} prev_node = prev_node[val] prev_key = None else: prev_node[key] = {} prev_node = prev_node[key] prev_key = val for k, v in current_nodes.items(): if k in result: result[k].update(v) else: result[k] = v for elem in input_data: if isinstance(elem, dict) and len(elem) == 1: key, val = next(iter(elem.items())) result[key] = val elif isinstance(elem, list): process_path(elem) return result # 测试运行 example = [ {'g': 'h'}, [ {'a': 'b'}, {'c': 'd'}, {'a': 'b'}, {'e': 'f'} ] ] output = build_graph(example) print(output)
输出结果
运行后得到的结果与你的预期结构一致:
{ 'g': 'h', 'a': { 'b': { 'c': 'd', 'e': 'f' } } }
逻辑说明
- 遍历输入的每个顶级元素:
- 若为单键值对字典,直接作为顶级键值对加入结果;
- 若为列表,调用
process_path函数处理路径序列。
process_path函数负责串联路径:- 遍历路径中的每个键值对,将前一个值作为后一个键的父节点;
- 遇到相同前缀(如再次出现
{'a':'b'}),将后续节点挂载到已有的a->b路径下; - 最终把处理好的路径合并到结果字典中。
内容的提问来源于stack exchange,提问作者Carabes
相关产品推荐
相关产品推荐

