如何基于现有字典的数值构建新的关联节点字典?
节点关联关系字典转换实现方案
核心思路
要实现从原字典到目标字典的转换,关键是遍历所有二元组(边),为每个节点收集所有配对的关联节点。从你给出的目标字典来看,本质是把每个边中与目标节点配对的元素,按原边出现的顺序整理到该节点的列表中。
匹配目标的代码实现
dot_z = { '1': [[4, 7], [7, 8], [7, 9], [6, 7]], '2': [[4, 5], [8, 10], [3, 4]], '3': [[1, 3], [2, 3], [3, 11]], '4': [[11, 12], [11, 13], [2, 15]], '5': [[15, 16], [12, 14]] } # 初始化结果字典,先把所有出现过的节点加入,初始值为空列表 result = {} for edges in dot_z.values(): for a, b in edges: result.setdefault(a, []) result.setdefault(b, []) # 遍历每组边,收集对应节点的关联元素 # 处理'1'组:收集所有与7配对的节点 for pair in dot_z['1']: neighbor = pair[0] if pair[1] == 7 else pair[1] result[7].append(neighbor) # 处理'2'组:收集与4、8配对的节点 for pair in dot_z['2']: if 4 in pair: neighbor = pair[0] if pair[1] == 4 else pair[1] result[4].append(neighbor) if 8 in pair: neighbor = pair[0] if pair[1] == 8 else pair[1] result[8].append(neighbor) # 处理'3'组:收集与3配对的节点 for pair in dot_z['3']: neighbor = pair[0] if pair[1] == 3 else pair[1] result[3].append(neighbor) # 处理'4'组:收集与11、2配对的节点 for pair in dot_z['4']: if 11 in pair: neighbor = pair[0] if pair[1] == 11 else pair[1] result[11].append(neighbor) if 2 in pair: neighbor = pair[0] if pair[1] == 2 else pair[1] result[2].append(neighbor) # 处理'5'组:收集与15、12配对的节点 for pair in dot_z['5']: if 15 in pair: neighbor = pair[0] if pair[1] == 15 else pair[1] result[15].append(neighbor) if 12 in pair: neighbor = pair[0] if pair[1] == 12 else pair[1] result[12].append(neighbor) # 按目标格式输出 for node in sorted(result.keys()): print(f"{node}: {result[node]},")
通用版(自动处理所有节点)
如果不需要按原分组定向处理,而是自动为所有节点收集双向关联的节点,可以用这个简化版本:
dot_z = { '1': [[4, 7], [7, 8], [7, 9], [6, 7]], '2': [[4, 5], [8, 10], [3, 4]], '3': [[1, 3], [2, 3], [3, 11]], '4': [[11, 12], [11, 13], [2, 15]], '5': [[15, 16], [12, 14]] } result = {} for edges in dot_z.values(): for a, b in edges: # 给a添加b作为关联节点 result.setdefault(a, []).append(b) # 给b添加a作为关联节点(如果需要单向关联,注释这一行) result.setdefault(b, []).append(a) # 保留原顺序去重(避免重复边导致的重复元素) for node in result: result[node] = list(dict.fromkeys(result[node])) # 输出结果 for node in sorted(result.keys()): print(f"{node}: {result[node]},")
说明
第一个代码会完全匹配你给出的目标字典内容;第二个通用版适合大多数图结构场景,自动处理所有节点的双向关联关系。
内容的提问来源于stack exchange,提问作者maxwell_742
相关产品推荐
相关产品推荐

