0
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

ここでは、リストのリスト (つまり、マトリックス) 内の最小数と最大数を見つけて、実際の値と、マトリックス内のその値の位置を返す関数があります。今私の問題はhigh_loc = [i][j]low_loc = [i][j]「リストインデックスが範囲外です」というエラーが表示され、その理由がわかりません。if文も同じ論理で範囲外ではないでしょうか?

4

2 に答える 2

1

これが解決策です。これは清潔だ。ただし、大きな行列の場合は、それらを 1 回だけ反復し、その反復中にすべての情報を収集するように最適化する必要があります。

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))

編集:ご存知のとおり、最適化されたバージョンは次のとおりです。

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

EDIT2:

これは、あなたのどちらかが行うことができるより良い理解のための経験です. コードを理解したい場合は、同じことをお勧めします。

>>> 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')
于 2013-11-14T07:48:23.783 に答える
1

問題は行にありlow_loc = [i][j]ます。=記号の右側の式では、[i]は要素が 1 つのリストであり、そのリストから[i][j]位置の要素を抽出しようとする試みを表しjます。でないと失敗しj == 0ます。おそらくあなたが望んでいたlow_loc = [i, j]か、low_loc = (i, j)代わりに?(もちろん、同じコメントが行high_loc = [i][j]にも当てはまります。)

于 2013-11-14T08:02:47.020 に答える