查找嵌套图表中的所有路径

时间:2017-03-28 16:38:41

标签: python graph path

我一直在努力寻找一个似乎是一个相对简单的问题的解决方案。

给出图g:

g = {'A': ['B', 'C'],
     'B': ['A', 'C'],
     'C': ['D'],
     'D': [],
     }

可以使用此解决方案(我找到here)找到所有路径:

def paths(graph, v):
    path = [v]                  # path traversed so far
    seen = {v}                  # set of vertices in path
    def search():
        dead_end = True
        for neighbour in graph[path[-1]]:
            if neighbour not in seen:
                dead_end = False
                seen.add(neighbour)
                path.append(neighbour)
                yield from search()
                path.pop()
                seen.remove(neighbour)
        if dead_end:
            yield list(path)
    yield from search()

paths(g,'A')

>>  [['A', 'B', 'C', 'D'], ['A', 'C', 'D']]

为了使问题更复杂,我想找到g中的所有路径,但是当列表嵌套时。例如,将g视为

g2 = {'A': [['B', 'C'],['D']],
     'B': [['A'], ['C']],
     'C': [['D']],
     'D': [[]]}

我正在寻找的解决方案是

[ [['A', 'B', 'C', 'D'], ['A', 'C', 'D']], ['A', 'D'] ] 

其中前两个路径组合在一起(即,总的来说,我希望得到两条路径)。但是上述功能还不够。我已经尝试将此代码应用于我的问题,但我没有成功。

我正在使用的实际图形相当大,字典中的许多元素都是这些嵌套列表,因此路径的数量可能会相当快地增长。

我希望这个例子有意义。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

>>> {key:[ele for lst in value for ele in lst] for key, value in g2.iteritems()}
{'A': ['B', 'C', 'D'], 'C': ['D'], 'B': ['A', 'C'], 'D': []}

在我看来,flattening the lists可以解决您的问题。

或者,没有字典&列表理解:

result = {}
for key, value in g2.iteritems():
    result[key] = []
    for lst in value:
        for ele in lst:
            result[key].append(ele)

如果您想通过原始图表g2对结果进行排序:

# Sort by 2nd value in list
res = []
for lst in g2['A']:
    res.append([])
    for reslst in res:
        if reslst[1] in lst:
            res[-1].append(reslst)
    if len(res[-1]) == 0:
        res.pop()

[[['A', 'B', 'C', 'D'], ['A', 'C', 'D']], [['A', 'D']]]