我的程序中有一个函数可以执行split和float。然后将矩阵传递给主程序。现在我有一个函数来查找具有最小值的行和列。我得到了所有值的列表,但没有得到具有最小值的行和列。
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)。
答案 0 :(得分: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]
在矩阵中是 a 最小值。如果您想要包含该位置的确切值,请返回:
return result[1], result[0][1], result[0][0]
答案 1 :(得分: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])