python - 列表列表之间的最短路径

标签 python loops recursion

假设我有一个这样的列表:

[
[1, [2, 3]],
[2, [4, 5]],
[4, [6, 7]],
[3, [7]]
]

我想编写代码来找到从 17 的最短路径,在本例中为 1 -> 3 -> 7 .

这是我到目前为止所拥有的:

start = 1
lst = [[1, [2, 3]], [2, [4, 5]], [4, [6, 7]], [3, [7]]]

def getIt(start):
    for nest in lst:
        if start == lst[0]:
            return(nest[1])

allLists = []
loopCleaner = []
def travel(paths, totalList):
    if paths is not None:
        if 7 in paths:
            allLists.append(totalList)
        else:
            for path in paths:
                if path not in loopCleaner:
                    loopCleaner.append(path)
                    totalList.append(path)
                    travel(getIt(path), totalList)

print(travel(lst, []))
<小时/>

我正在通过递归和循环的混合来尝试这个,但它要么输出太长的路径,要么只是没有输出。

我的逻辑:通过getIt获取所有可能的嵌套列表。

然后通过递归迭代这些路径,并在总列表下降时不断添加到总列表中,直到在其中一个路径中找到 7。在这种情况下,我们结束并退出。如何以简单地得到 [1, 3, 7] 的方式进行编码?

最佳答案

您可以使用带有生成器的递归:

def paths(d, start, end, c = [], seen=[]):
  if end in d.get(start, []):
     yield c+[end]
  else:
     for i in filter(lambda x:x not in seen, d.get(start, [])):
        yield from paths(d, i, end, c = c+[i], seen=seen+[i])

data = [[1, [2, 3]], [2, [4, 5]], [4, [6, 7]], [3, [7]]]
print(min(list(paths(dict(data), 1, 7, c=[1])), key=len))

输出:

[1, 3, 7]

关于python - 列表列表之间的最短路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56066845/

相关文章:

python - gzip.open 作为 subprocess.Popen 的标准输入

python (django) hashlib vs Nodejs 加密

php - 在循环中,这有关系吗?

loops - Google Analytics(分析)自然搜索循环问题

algorithm - 不使用数组递归创建所有子集

recursion - SML 中的递归匿名函数

Python 日志记录 : Change "WARN" to "INFO"

python - 将包含字符串和int对象的列表转换为字节数组以进行套接字通信

r - 如何根据条件将向量元素与前一个元素粘贴在一起

javascript - 将多次递归调用转换为尾递归