如何在Python中基于条件创建结果组合矩阵?
我试图找出一种简单的方法,从python中给定的列表中获得指向同一起点/终点的路径组合 例如,假设我的列表是如何在Python中基于条件创建结果组合矩阵?,python,iterator,Python,Iterator,我试图找出一种简单的方法,从python中给定的列表中获得指向同一起点/终点的路径组合 例如,假设我的列表是 list1 = ['A/B','B/A','B/C','C/D','C/A','D/E,'E/C'] 我试图使用itertools.permutations()生成以下路径,但不确定如何让它搜索任意数量的步骤,以到达A作为结束字母 [('A/B','B/C','C/A'),('A/B','B/C','C/D','C/A'),('A/B','B/A')] 正如我在评论中所写,你有一个有
list1 = ['A/B','B/A','B/C','C/D','C/A','D/E,'E/C']
我试图使用itertools.permutations()
生成以下路径,但不确定如何让它搜索任意数量的步骤,以到达A
作为结束字母
[('A/B','B/C','C/A'),('A/B','B/C','C/D','C/A'),('A/B','B/A')]
正如我在评论中所写,你有一个有向图(X/Y是边,X和Y是顶点),你试图找到所有的循环,没有任何特殊的困难 下面是一个示例,说明如何从列表中创建图形(由邻接列表表示),然后从检测到的循环中重建边
def get_cycles(edges):
# create the graph from the edges
graph = {}
for e in edges:
v1, v2 = e.split('/')
graph.setdefault(v1, []).append(v2)
for cycle in graph_cycles(graph):
# rebuld the edges from the cycle
if len(cycle) == 1:
yield (cycle[0]+"/"+cycle[0], )
else:
# zip a,b,...,y,z with b,c,...,z,a to get the edges a/b, b/c, ..., y/z, z/a
yield tuple([a+"/"+b for a,b in zip(cycle[-1:]+cycle[:-1], cycle)])
print (list(get_cycles(['A/A', 'A/B','B/A','B/C','C/D','C/A','D/E','E/C'])))
# output: [('A/B', 'B/C', 'C/A'), ('A/B', 'B/A'), ('A/A',), ('B/C', 'C/A', 'A/B'), ('B/A', 'A/B'), ('C/A', 'A/B', 'B/C'), ('C/D', 'D/E', 'E/C'), ('D/E', 'E/C', 'C/D'), ('E/C', 'C/D', 'D/E')]
如果图形足够小,一个简单的深度优先搜索就可以了。例如,您可以查看:
def graph_cycles(graph):
return (cycle for node in graph for cycle in dfs(graph, node, node)) # dfs defined in https://stackoverflow.com/a/40834276
这远不是最佳解决方案,但您可以替换graph\u cycles
通过更好的实现(Tarjan或Kosaraju的算法,见en.wikipedia.org/wiki/Strongly_connected_component)
在这两种情况下,您必须特别注意直接指向自身的节点(X/X边)。您有一个有向图(X/Y
是边,X
和Y
是顶点)。要查找所有循环,可以使用Tarjan算法或Koasarju算法。请看。这里输入错误------是Kosaraju。