从矩阵中枚举和更新项目的 pythonic 解决方案是什么?

What is the pythonic solution to enumerate and update items from a matrix?

我使用矩阵中的值 enumerate 做了一个 for 循环,并尝试为不同于 0 的项目分配一个值,同时附加到等于 0 的列表元素。事实是原始矩阵未更新。

示例代码:

matrix = [[0, 0, 0], [0, 1, 0], [1, 1, 1]]
current = []
for x, i in enumerate(matrix):
    for y, j in enumerate(i):
        if j == 0:
            current.append((x, y))
        else:
            #matrix[x][y] = -1 # This works
            j = -1 # This doesn't

由于这不起作用,因此在这种情况下使用枚举没有实用性。所以我将代码更改为:

matrix = [[0, 0, 0], [0, 1, 0], [1, 1, 1]]
current = []
for x in range(len(matrix)):
    for y in range(len(matrix[0])):
        if matrix[x][y] == 0:
            current.append((x, y))
        else:
            matrix[x][y] = -1

IMO 上面的代码可读性要差得多,而且 pylint 建议不要将其与以下代码一起使用:

C0200: Consider using enumerate instead of iterating with range and len (consider-using-enumerate)

您不能仅通过分配给局部变量 j = -1 来更新二维数组 就地 (在每次循环迭代时重新初始化 for y, j in enumerate(i)) .

在您的简单情况下,您可以使用以下简单遍历更新您的 矩阵

matrix = [[0, 0, 0], [0, 1, 0], [1, 1, 1]]
for i, row in enumerate(matrix):
    for j, val in enumerate(row):
        if val != 0: matrix[i][j] = -1

print(matrix)    # [[0, 0, 0], [0, -1, 0], [-1, -1, -1]]

尽管 Numpy 提供了更强大的更新矩阵的方法:

import numpy as np

matrix = np.array([[0, 0, 0], [0, 1, 0], [1, 1, 1]])
matrix = np.where(matrix == 0, matrix, -1)

print(matrix)