列表索引超出范围,但为什么? def list_2d_位置(行、列、低_范围、高_范围): 矩阵=列表\u 2d\u生成(行、列、低\u范围、高\u范围) 打印(矩阵) 低值=高值=矩阵[0][0] 对于范围内的i(行): 对于范围内的j(列): 如果矩阵[i][j]高值: 高值=矩阵[i][j] 高_loc=[i][j] 返回低位、高位、低位、高位

列表索引超出范围,但为什么? def list_2d_位置(行、列、低_范围、高_范围): 矩阵=列表\u 2d\u生成(行、列、低\u范围、高\u范围) 打印(矩阵) 低值=高值=矩阵[0][0] 对于范围内的i(行): 对于范围内的j(列): 如果矩阵[i][j]高值: 高值=矩阵[i][j] 高_loc=[i][j] 返回低位、高位、低位、高位,list,python-3.x,matrix,find,List,Python 3.x,Matrix,Find,我这里有一个函数,它应该在列表(即矩阵)中找到最小和最大的数字,并返回实际值,以及该值在矩阵中的位置。现在我的问题是high_loc=[i][j]和low_loc=[i][j]都给了我“列表索引超出范围”的错误,我不明白为什么。if语句是否也会超出相同逻辑的范围?这里有一个解决方案。它是干净的。然而,对于大型矩阵,它应该被优化为只在它们上面迭代一次,并在迭代过程中收集所有信息 def list_2d_locations(rows, columns, low_range, high_range):

我这里有一个函数,它应该在列表(即矩阵)中找到最小和最大的数字,并返回实际值,以及该值在矩阵中的位置。现在我的问题是
high_loc=[i][j]
low_loc=[i][j]
都给了我“列表索引超出范围”的错误,我不明白为什么。if语句是否也会超出相同逻辑的范围?

这里有一个解决方案。它是干净的。然而,对于大型矩阵,它应该被优化为只在它们上面迭代一次,并在迭代过程中收集所有信息

def list_2d_locations(rows, columns, low_range, high_range):
    matrix = list_2d_generate(rows, columns, low_range, high_range)
    print(matrix)
    low_val = high_val = matrix[0][0]
    for i in range(rows):
        for j in range(columns):
            if matrix[i][j] < low_val:
                low_val = matrix[i][j]
                low_loc = [i][j]
            if matrix[i][j] > high_val:
                high_val = matrix[i][j]
                high_loc = [i][j]
    return low_val, high_val, low_loc, high_loc
编辑:你知道吗,这是优化的版本:

m = [[3,5,1], [56,43,12], [4,52,673]]

def f(matrix):
    cols = len(matrix[0])
    flatten = [val for row in matrix for val in row]
    min_val, max_val = min(flatten), max(flatten)
    min_i, max_i = flatten.index(min_val), flatten.index(max_val)
    return min_val, max_val, divmod(min_i, cols), divmod(max_i, cols)

>>> f(m)
(1, 673, (0, 2), (2, 2))

问题出在
low_loc=[i][j]
行中。在
=
符号右侧的表达式中,
[i]
是一个包含单个元素的列表,
[i][j]
表示试图从该列表中提取位置
j
处的元素。这将失败,除非
j==0
。也许你想要
low_loc=[i,j]
或者
low_loc=(i,j)
?(当然,相同的注释适用于行
high_loc=[i][j]

如果所有值都相同,则永远不会设置
high_loc
(和low)。如果矩阵[i][j]>=high_val,可能会使用
?尝试过了,仍然有同样的问题。虽然我确信这是一个很好的方法,但这超出了我目前对python语言的理解。无论如何谢谢你!
def f(matrix):
    try:
        min_val, max_val = matrix[0][0], matrix[0][0]
    except IndexError:
        raise ValueError("Expected a real matrix.") from None
    genexp = (val for row in matrix for val in row)
    cols = len(matrix[0])
    min_i, max_i = (0, 0), (0, 0)
    for i, val in enumerate(genexp):
        if val < min_val:
            min_val, min_i = val, divmod(i, cols)
        elif val > max_val:
            max_val, max_i = val, divmod(i, cols)
    return min_val, max_val, min_i, max_i
>>> matrix = [[3,5,1], [56,43,12], [4,52,673]]
>>> flatten = [val for row in matrix for val in row]
>>> flatten
[3, 5, 1, 56, 43, 12, 4, 52, 673]
>>> flatten.index(56)
3
>>> divmod(3,3)
(1, 0)
>>> for elem in enumerate(["one", "two", "three"]):
...     elem
...
(0, 'one')
(1, 'two')
(2, 'three')