1

我的程序中有一个函数可以进行拆分和浮动。然后将矩阵传递给主程序。现在我有一个函数可以找到最小值的行和列。我得到了所有值的列表,但没有得到最小值的行和列。

def closest_pair(e):
    for row in range(len(e)):
       for col in range(0,len(row),1):
          minrow = min(e[row])
          mincol = min(e[col])
          return ([minrow], [mincol])

E 是从 main 传递给此函数的方阵。输入是具有如下值的 txt 文件:

2 1 7 7
1 2 7 7
2 5 6 7
5 6 8 9

预期的输出应该是 (1, 1) 或第 1 行和第 1 列,它在矩阵中具有较低的值。

这帮助我找到了行和列的最小值,但是输出是得到这对。同样对于第一个值为 0 的值,0 将不计入,因此如果 (0, 0) 的值为 0,则不算作最小值。话虽如此,例如,如果第 1 行和第 1 列,值是 [2,2] 作为对,并且是唯一比输出 (1,1) 的最小对。

4

2 回答 2

2

您需要找到每行的最小值,然后才能确定具有最小列的行的坐标:

result = min((min((v, c) for c, v in enumerate(row)), r) for r, row in enumerate(e))
return result[1], result[0][1]

此代码用于使用enumerate()列索引注释每个值,找到每行的最小值,用行号(再次使用enumerate)注释每行最小值并找到最小行。结果是一个带有 的嵌套元组((value, column), row),我们将其解包以返回行和列索引。

演示:

>>> e = [[2, 1, 7, 7], [1, 2, 7, 7], [2, 5, 6, 7], [5, 6, 8, 9]]
>>> result = min((min((v, c) for c, v in enumerate(row)), r) for r, row in enumerate(e))
>>> result[0][1], result[1]
(0, 1)

所以位置e[0][1]是矩阵中最小值。如果您还想包含该位置的确切值,请返回:

return result[1], result[0][1], result[0][0]
于 2013-04-16T16:07:42.020 回答
0

e是一个列表,对吗?

因此min(e[row]),并且min(e[col])会给你列表。

您还可以使用enumerate更轻松地遍历列表

for col, row in enumerate(e):
  minrow = min(row)
  mincol = min([row[col] for row in e]) # need to transpose to a new list
  return ([minrow], [mincol])
于 2013-04-16T16:09:35.720 回答