【问题标题】:Finding all paths in nested graphs查找嵌套图中的所有路径
【发布时间】:2017-08-21 20:37:21
【问题描述】:

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

给定一个图形 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'] ] 

前两条路径组合在一起(即,我总共想要两条路径)。然而,上述功能是不够的。我已尝试根据我的问题调整此代码,但没有成功。

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

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

【问题讨论】:

  • 有什么理由不只是扁平化列表吗? {'A': ['B', 'C', 'D']} 会在您的示例中给出所需的结果吗?如果不是,它有什么不同。

标签: python graph path


【解决方案1】:
>>> {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']]]

【讨论】:

  • 展平并插入生成器会产生 3 条路径([['A', 'B', 'C', 'D'], ['A', 'C', 'D'] , ['A', 'D']]),但我需要将前两条路径组合成一条路径。
  • @chewbaccabacca 我添加了一个解决方法......它并不漂亮,但它很简单。
  • 感谢您的回复。如果我将原始 g2 与嵌套列表一起使用,这实际上对我不起作用。
猜你喜欢
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 2017-05-06
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
相关资源
最近更新 更多