Python中的多条件生成器表达式?

问题描述

我正在尝试使用最近邻法为旅行商问题创建近似解。这些城市由嵌套列表形式的加权邻接矩阵表示,如下所示: [[0,4,3,5],[4,5,3],[3,4],[5,0]]

还有一个布尔矩阵,用于确定哪些节点已经被访问过。

我的问题: 我正在尝试使用多条件生成器表达式来查找尚未访问的每个列表中的非零最小值。我正在尝试使用此行执行此操作:listMin = min(i for i in next if ((i>0) and (visited[next.index(i)] == False))) 我如何才能使其工作?

请注意,当我只是查找非零值时,此生成器表达式会按预期运行,它是附加条件语句,通过给我一个 ValueError: min() arg is empty sequence 将其丢弃。

更多代码在这里

start = matrix[0]
visited[0] = True
listMin = min(i for i in start if i>0)
cost = listMin
minIndex = start.index(listMin)

while (False in visited):
    next = matrix[minIndex]
    visited[minIndex] = True
    order.append(int(minIndex))

    listMin = min(i for i in next if ((i>0) and (visited[next.index(i)] == False)))
    minIndex = next.index(listMin)
    
    cost += listMin`

EDIT- 想补充一点,在使用 if 语句验证未访问过最小节点后,我的代码似乎适用于测试用例,但我只是好奇是否以这种方式使用生成器表达式有可能

解决方法

ValueError: min() arg is empty sequence.

如果您允许 min 第一个参数为空,您应该使用关键字参数 default 来设置在这种情况下它应该返回的内容。简单例子:

v1 = min([],default=-1)  # using list
v2 = min((i for i in []),default=-1)  # using generator,note brackets usage
print(v1,v2)  # -1 -1

如果您想检查提供给 min 的第一个参数是否为空,只需使用从未出现在您的数据中的值。