Python:从理解中删除空列表

Python:从理解中删除空列表,python,list-comprehension,Python,List Comprehension,我正在实现dijkstras算法来计算最短路径。我的问题是,是否有一种更清晰的方法来实现以下理解(即不在末尾附加if[b代表a,b在G[x]如果a不在x]!=[]) 在下面的例子中,G是一个图,其中它的键是图节点,每个节点都有一个表示其连接边的元组列表。因此,每个元组包含以下信息:(连接节点,到连接节点的距离)。X是算法已查看的一组节点,字典将已找到的节点映射到距起始节点(本例中为节点1)最短的距离 更新:很抱歉,我给出了一个有效的例子,如果删除理解的最后一部分,这个例子就不起作用了 G = {

我正在实现dijkstras算法来计算最短路径。我的问题是,是否有一种更清晰的方法来实现以下理解(即不在末尾附加
if[b代表a,b在G[x]如果a不在x]!=[]

在下面的例子中,G是一个图,其中它的键是图节点,每个节点都有一个表示其连接边的元组列表。因此,每个元组包含以下信息:(连接节点,到连接节点的距离)。X是算法已查看的一组节点,字典将已找到的节点映射到距起始节点(本例中为节点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]!=[]])
问题是如何将Mindsist作为一种理解来编写,它可以处理
min([[],[some number],])

最后一部分,,
if[b代表a,b代表G[x]如果a不在x]!=[]]
只是删除空列表,这样min不会失败,但是有更好的方法来写吗
理解,所以没有空列表。

这不是一个完整的解决方案,但因为你只是在摆脱空列表,你可以缩短条件。空列表的计算结果为False。包含任何内容的列表将被评估为true。只需提供列表作为条件。这适用于所有空的内置数据类型。

这不是一个完整的解决方案,但由于您只是在摆脱空列表,因此可以缩短条件。空列表的计算结果为False。包含任何内容的列表将被评估为true。只需提供列表作为条件。这适用于所有空的内置数据类型。

首先,空列表在布尔值中被认为是错误的,因此您不需要对
[]
进行不平等性测试<代码>如果[b代表a,b在G中[x]如果a不在x中]就足够了

您真正想要做的是生成一次内部列表,然后一次性测试并计算最小值。使用额外的内部“循环”执行此操作:

mindist = min(A[x] + min(inner) 
              for x in X 
              for inner in ([b for a,b in G[x] if a not in X],) if inner)
for internal over(…,)
循环迭代一次生成列表的单元素元组,这样您就可以在计算要传递给外部
min()
调用的
a[x]+min(internal)
结果之前测试它是否为空(
if internal

请注意,您不需要对该外部循环进行列表理解;相反,这是一个生成器表达式,可以保存您构建的列表对象,然后再次丢弃该对象

演示:


首先,空列表在布尔值中被认为是错误的,因此您不需要根据
[]
测试不平等性<代码>如果[b代表a,b在G中[x]如果a不在x中]就足够了

您真正想要做的是生成一次内部列表,然后一次性测试并计算最小值。使用额外的内部“循环”执行此操作:

mindist = min(A[x] + min(inner) 
              for x in X 
              for inner in ([b for a,b in G[x] if a not in X],) if inner)
for internal over(…,)
循环迭代一次生成列表的单元素元组,这样您就可以在计算要传递给外部
min()
调用的
a[x]+min(internal)
结果之前测试它是否为空(
if internal

请注意,您不需要对该外部循环进行列表理解;相反,这是一个生成器表达式,可以保存您构建的列表对象,然后再次丢弃该对象

演示:


好的,我必须解开那个疯狂的列表理解来弄清楚你在说什么-我认为这是大致相同的代码:

dists = []
for x in X:
    newdists = [b for a,b in G[x] if a not in X]
    if len(newdists) > 0
        dists.append(A[x] + min(newdists))
mindist = min(dists)
这里有一种方法可以消除有问题的测试:

import sys

def newMin(values):
    if len(values) == 0:
        return float('inf')
    else:
        return min(values)

mindist = min(A[x] + newMin([b for a,b in G[x] if a not in X]) for x in X)

print mindist
输出:

40

好的,我必须解开那个疯狂的列表理解来弄清楚你在说什么-我认为这是大致相同的代码:

dists = []
for x in X:
    newdists = [b for a,b in G[x] if a not in X]
    if len(newdists) > 0
        dists.append(A[x] + min(newdists))
mindist = min(dists)
这里有一种方法可以消除有问题的测试:

import sys

def newMin(values):
    if len(values) == 0:
        return float('inf')
    else:
        return min(values)

mindist = min(A[x] + newMin([b for a,b in G[x] if a not in X]) for x in X)

print mindist
输出:

40
这里有一个想法:

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
值(对应于空列表)。

这里有一个想法:

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
值(对应于空列表)。

空列表的计算结果为False。空列表的计算结果为False。如果某些计算路径的长度大于sys.maxint,所以可能不是最好的解决方案。
min(A[x]+min([b代表A,b代表G[x]如果A不在x]或[float('inf')])代表x在x)
:)好主意-我将用它代替sys.maxint。如果某些计算路径的长度大于sys.maxint,这可能会导致算法失败,因此可能不是最好的解决方案。
min(A[x]+min([b代表a,b代表G[x]如果a不在x]或[float('inf')])代表x在x中)
:)好主意-我将合并它来代替sys.maxint.interest,所以删除[]只需要
if inner
?我想我不明白生成器是如何工作的。@noah:在布尔上下文中,空列表是错误的。
!=[]
在任何地方都是多余的,不仅仅是在生成器表达式中。有趣的是,删除[]只需要
if-inner
?我想我不明白生成器是如何工作的。@noah:在布尔上下文中,空列表是错误的。
!=[]
在任何地方都是多余的,而不仅仅是在生成器表达式中。使用此答案是为了简单:)使用此答案是为了简单:)