我正在实现 dijkstras 算法来计算最短路径。我的问题是是否有一种更清晰的方法来实现以下理解(即不添加 if [b for a,b in G[x] if a not in X]!=[]]
结束)。
下面,G是一个图,其键是图节点,每个节点都有一个表示其连接边的元组列表。因此每个元组包含信息:(连接节点,到连接节点的距离)。 X 是算法已经查看过的一组节点,A 是将已找到的那些节点映射到距起始节点(在本例中为节点 1)的最短距离的字典。
更新:抱歉,我给出了一个有效的示例,如果删除理解的最后一部分,这里的示例将不起作用。
G = {1: [(2, 20), (3, 50)], 2: [(3, 10), (1, 32)], 3: [(2, 30), (4, 10)], 4: [(1, 60)]}
X = {1,2,3}
A = {1: 0, 2: 20, 3:30}
mindist = min([A[x] + min([b for a,b in G[x] if a not in X]) for x in X if [b for a,b in G[x] if a not in X]!=[]])
问题是如何将 Mindist 编写为可以处理 min([[],[some number],[])
的理解。
最后一部分,
if [b for a,b in G[x] if a not in X]!=[]]
只是删除空列表,这样 min 就不会失败,但是有没有更好的方法来编写它
理解,因此不存在空列表。
最佳答案
这是一个想法:
minval = [float('+inf')]
min(A[x] + min([b for a, b in G[x] if a not in X] + minval) for x in X)
=> 40
诀窍?确保最里面的 min()
始终有一个可用的值,即使它是一个虚拟值:一个正无穷大,因为任何东西都会比它小。这样,最外层的 min()
在计算最小值时将忽略 inf
值(对应于空列表)。
关于Python:从理解中删除空列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18156545/