【问题标题】:Multi-conditional generator expression in Python?Python中的多条件生成器表达式?
【发布时间】:2021-08-26 05:25:30
【问题描述】:

我正在尝试使用最近邻法为旅行推销员问题创建一个近似解。城市由加权邻接矩阵以嵌套列表的形式表示,如下所示: [[0, 4, 3, 5], [4, 0, 5, 3], [3, 5, 0, 4], [5, 3, 4, 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`

编辑-想补充一点,在使用 if 语句验证 min 节点未被访问后,我的代码似乎正在为测试用例工作,但我只是好奇是否以这种方式使用生成器表达式是可能的

【问题讨论】:

    标签: python python-3.x generator-expression


    【解决方案1】:

    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 的第一个参数是否为空,请使用从未出现在数据中的值。

    【讨论】:

      猜你喜欢
      • 2017-12-08
      • 2018-05-02
      • 2014-04-02
      • 2021-12-27
      • 2019-02-28
      • 2019-07-11
      • 1970-01-01
      • 2021-10-17
      • 2021-04-26
      相关资源
      最近更新 更多