Что такое питоническое решение для перечисления и обновления элементов из матрицы? - PullRequest
0 голосов
/ 13 октября 2019

Я сделал цикл for, используя enumerate из значений в матрице, и попытался присвоить значение элементам, отличным от 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: рассмотрите возможность использования перечисления вместо итерациис range и len (рассмотрим использование перечисления)

1 Ответ

1 голос
/ 13 октября 2019

Вы не можете просто обновить 2d массив на месте путем присвоения локальной переменной 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)
...