如何根据node_pair匹配edge_list对应数值对?代码输出异常求助
问题解决:按节点对顺序匹配对应数值
你的代码问题在于遍历edge_list时,会按列表原有顺序添加匹配到的数值,完全忽略了node_pair的顺序要求。比如处理('b','a')时,依然先找到'a'对应的1,再找到'b'对应的11,所以结果还是[1,11];另外start_node = pair[0][0]是多余的,pair[0]已经是'a'或'b',无需再取索引0。
最优解决方案:构建映射字典
先创建一个orig-id到数值的映射字典,既可以快速查找,又能严格遵循node_pair的顺序输出结果:
node_pair = [('a', 'b'), ('b', 'a')] edge_list = [ (1, 'unuseful thing', {'orig-id': 'a'}), (11, 'unuseful thing', {'orig-id': 'b'}), ] # 构建orig-id到数值的映射,仅需执行一次 id_to_num = {edge[2]['orig-id']: edge[0] for edge in edge_list} for pair in node_pair: start_node = pair[0] end_node = pair[1] print(f'from {start_node} --> to {end_node}') # 按节点对顺序从字典中取值 graph_start_end_node = [id_to_num[start_node], id_to_num[end_node]] print(graph_start_end_node)
执行结果:
from a --> to b [1, 11] from b --> to a [11, 1]
这种方法的优势:
- 映射字典仅需构建一次,当
edge_list规模较大时,效率远高于重复遍历列表 - 直接通过键值对查找,严格遵循节点对的顺序,不会出现顺序错误
替代方案:分两次遍历查找
如果不想使用字典,也可以修改遍历逻辑,先找起始节点对应数值,再找结束节点对应数值:
node_pair = [('a', 'b'), ('b', 'a')] edge_list = [ (1, 'unuseful thing', {'orig-id': 'a'}), (11, 'unuseful thing', {'orig-id': 'b'}), ] for pair in node_pair: start_node = pair[0] end_node = pair[1] print(f'from {start_node} --> to {end_node}') graph_start_end_node = [] # 先查找起始节点对应的数值 for edge in edge_list: if edge[2]['orig-id'] == start_node: graph_start_end_node.append(edge[0]) break # 找到即退出循环 # 再查找结束节点对应的数值 for edge in edge_list: if edge[2]['orig-id'] == end_node: graph_start_end_node.append(edge[0]) break print(graph_start_end_node)
该方案能解决顺序问题,但每个节点对都需要遍历两次edge_list,效率低于字典映射方案。
内容的提问来源于stack exchange,提问作者MaxDragonheart
相关产品推荐
相关产品推荐

