Python实现列表中3元素闭环路由的唯一组合查找方案
嘿,作为Python新手碰到这个问题完全不用慌,我来一步步带你搞定它!我们的目标是从给定的路径列表里找出所有恰好3个元素的唯一闭环路由组合——也就是走三步之后回到起点的环,而且要避免重复记录同一个环(比如A→B→C→A和B→C→A→B其实是同一个环,只保留一次)。
第一步:理解需求&预处理数据
首先,我们需要把原始的路径字符串(比如"A to B")转换成更易处理的格式,同时先去掉重复的路径(原列表里有重复的"B to C",留一个就够了)。
# 原始路径列表 original_paths = ['A to B', 'B to C', 'C to D', 'D to E', 'A to C', 'A to D', 'A to E', 'B to A', 'B to C', 'B to D', 'B to E', 'C to A', 'E to B', 'E to C', 'E to A'] # 1. 去重重复的路径字符串 unique_path_strings = list(set(original_paths)) # 2. 把每个路径转成(起点, 终点)的元组,方便后续判断连接关系 path_tuples = [tuple(p.split(' to ')) for p in unique_path_strings]
第二步:两种实现方式
方式一:用排列遍历(新手友好,逻辑直观)
我们可以用itertools.permutations生成所有三个路径的排列,然后检查它们是否能形成闭环,最后用节点排序的方式去重。
import itertools # 存储唯一环的标识(用排序后的节点元组,避免重复环) unique_rings = set() result_routes = [] # 遍历所有三个路径的排列 for path1, path2, path3 in itertools.permutations(path_tuples, 3): # 检查闭环条件:每个路径的终点是下一个路径的起点,最后回到最初的起点 if path1[1] == path2[0] and path2[1] == path3[0] and path3[1] == path1[0]: # 生成环的唯一标识:把三个节点排序后转成元组 node_key = tuple(sorted([path1[0], path1[1], path2[1]])) if node_key not in unique_rings: unique_rings.add(node_key) # 把元组转回路径字符串,存入结果 route = [ f"{path1[0]} to {path1[1]}", f"{path2[0]} to {path2[1]}", f"{path3[0]} to {path3[1]}" ] result_routes.append(route) # 打印结果 print("找到的所有唯一3元素闭环路由:") for i, route in enumerate(result_routes, 1): print(f"{i}. {route}")
方式二:用邻接表优化(效率更高,适合大量路径)
如果你的路径列表非常大,上面的排列遍历会很慢,这时候可以用邻接表(一个字典,key是起点,value是该起点能到达的所有终点)来优化,直接按节点的连接关系找环:
# 构建邻接表 adjacency = {} for start, end in path_tuples: if start not in adjacency: adjacency[start] = [] adjacency[start].append(end) unique_rings = set() result_routes = [] # 遍历每个起点 for start in adjacency: # 第一步:从start走到mid1 for mid1 in adjacency[start]: if mid1 == start: continue # 跳过自己到自己的路径(这里没有,但以防万一) # 第二步:从mid1走到mid2 if mid1 not in adjacency: continue for mid2 in adjacency[mid1]: if mid2 in (start, mid1): continue # 跳过回到起点或重复节点的情况 # 第三步:检查mid2是否能回到start if start in adjacency.get(mid2, []): # 生成唯一标识去重 node_key = tuple(sorted([start, mid1, mid2])) if node_key not in unique_rings: unique_rings.add(node_key) # 构建路径字符串 route = [ f"{start} to {mid1}", f"{mid1} to {mid2}", f"{mid2} to {start}" ] result_routes.append(route) # 打印结果 print("找到的所有唯一3元素闭环路由:") for i, route in enumerate(result_routes, 1): print(f"{i}. {route}")
结果说明
两种方法都会输出所有符合要求的唯一闭环组合,比如你例子里的['A to B', 'B to C', 'C to A']会被正确识别,而顺序不同的同环组合会被自动去重。
内容的提问来源于stack exchange,提问作者user13647136
相关产品推荐
相关产品推荐

