从矩阵中枚举和更新项目的 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)
我使用矩阵中的值 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)