【发布时间】:2012-12-16 07:00:44
【问题描述】:
我有一个 Python 代码可以找到传递闭包。
示例:
输入:{('A','B'),('B','C'),('C','D'),('E','F')}
输出:{('B', 'C'), ('A', 'D'), ('A', 'B'), ('C', 'D '), ('B', 'D'), ('E', 'F'), ('A', 'C')}
代码完美运行,但我正在寻找的是将输出作为一组子图。我是 Python 的初学者,我不知道该怎么做。
根据给定的输入,这是我正在寻找的输出,它在集合中有两个元素,每个元素代表传递闭包输出的一个子图:{(A, B, C, D) , (E, F)}
代码如下:
from collections import defaultdict
def transitive_closure(elements):
edges = defaultdict(set)
# map from first element of input tuples to "reachable" second elements
for x, y in elements: edges[x].add(y)
for _ in range(len(elements) - 1):
edges = defaultdict(set, (
(k, v.union(*(edges[i] for i in v)))
for (k, v) in edges.items()
))
return set((k, i) for (k, v) in edges.items() for i in v)
result = set(transitive_closure([('A','B'),('B','C'),('C','D'),('E','F')]))
print result
【问题讨论】:
-
你想要的东西没有很好的定义(至少不清楚)。你是什么意思“作为最长的可能路径”。例如,您希望以下输入的输出是什么: {('A','B'), ('B', 'C'), ('C', 'A), ('A', 'D'), ('D', 'E'), ('D', 'F')} ?
-
这似乎不是我的答案;你为什么不把它作为评论发布?
-
但是我问的那个案子呢?当你有一个循环或一棵有树枝的树时——那么你想要什么?你的问题没有很好的定义是我想说的。这就是我的答案——没有人能回答一个没有明确定义的问题。
-
['A', 'C', 'B', 'E', 'D', 'F'],这就是您的样本的结果。我明白了,我不应该说 PATH。肯定会有循环,这将导致无限循环。现在我将修改我的问题。
-
不清楚你在寻找什么子图。您在寻找连接的组件吗?
标签: python python-3.x python-2.7