我正在尝试在矩阵行中找到最小元素,但有两个条件:
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)
但有两个条件,它不起作用。
答案 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)