我一直在努力寻找一个似乎是一个相对简单的问题的解决方案。
给出图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'] ]
其中前两个路径组合在一起(即,总的来说,我希望得到两条路径)。但是上述功能还不够。我已经尝试将此代码应用于我的问题,但我没有成功。
我正在使用的实际图形相当大,字典中的许多元素都是这些嵌套列表,因此路径的数量可能会相当快地增长。
我希望这个例子有意义。任何帮助将不胜感激。
答案 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']]]