min()arg是一个空序列

时间:2014-11-24 21:45:02

标签: python python-3.x

我正在尝试在矩阵行中找到最小元素,但有两个条件: 1)必须> 0 2)并且必须不访问此点(is_visited[k] is False) 我正在尝试下一步:

min(x for x in matr_sum[i] if x > 0  if is_visited[k] is False )

但是有一个错误:min() arg is an empty sequence

完整的代码块:

for k in range(4):
        if matr_sum[i][k] == min(x for x in matr_sum[i] if x > 0  if is_visited[k] is False ) and i!=k:
            return k

如何解决?或者我应该写我的min()函数?因为它适用于一个条件:

min(x for x in matr_sum[i] if x > 0)

但有两个条件,它不起作用。

4 个答案:

答案 0 :(得分:6)

语法没有问题。拥有两个if条款肯定是不寻常的,但它是允许的。考虑:

print(min(x for x in range(1,300) if x % 3 == 0 if x % 5 == 0))

输出:

15

然而:

print(min(x for x in range(1,300) if x % 2 != 0 if x % 2 != 1))

输出:

ValueError: min() arg is an empty sequence

没有奇数和偶数的整数,因此min没有值可以查看,因此会引发异常。

我推断,在您的代码中,没有值传递这两个条件。 Python不允许你计算"没有值的最小值",主要是因为它没有任何意义。

由于没有大于0的值,您必须决定在没有最小值的情况下您想要做什么。例如,如果您想要在这种情况下返回k,那么我可能会重写您的代码:

for k in range(4):
    if k != i and is_visited[k] is False:
        if matr_sum[i][k] > 0 and matr_sum[i][k] == min(x for x in matr_sum[i] if x > 0):
            return k

为什么这会有所帮助可能并不明显,但假设matr_sum[i]是一个列表或类似内容,那么一旦我们知道matr_sum[i][k] > 0,我们就会知道传递给min的生成器并非如此。空了,所以我们不会得到例外。然而,如果matr_sum[i][k] <= 0,那么它肯定不等于最小的正值,因此根本不需要计算min。另一种写作方式是:

if matr_sum[i][k] > 0 and not any(0 < x < matr_sum[i][k] for x in matr_sum[i])

实际上,我通常会写if not is_visited[k],但我将其保留为is False,因为我不知道更改它是否会改变代码的行为。

答案 1 :(得分:3)

如果通常要避免此 ValueError ,可以将default参数设置为min(),如果列表为空,则返回该参数。请参见描述的here

min([], default="EMPTY")
# returns EMPTY

请注意,这仅适用于Python 3.4 +

答案 2 :(得分:1)

尝试此操作 - 它会创建x值xs的列表,然后仅在xs非空时才尝试查找min。您可能需要添加一些逻辑来处理xs 为空的情况,具体取决于您的代码正在执行的操作。

for k in range(4):
    if is_visited[k] is False and i != k:
        xs = [x for x in matr_sum[i] if x > 0]
        if xs and matr_sum[i][k] == min(xs):
            return k

答案 3 :(得分:0)

只需使用and操作来连接tow if语句:

min(x for x in matr_sum[i] if x > 0 and if is_visited[k] is False and i!=k)