Резервная переменная при создании матрицы по списку - PullRequest
2 голосов
/ 01 апреля 2012

Я пытаюсь заполнить мои matrix нулями. К сожалению, в следующем примере переменные x и y являются избыточными и:

self.matrix = [[0 for x in range(0, self.N)] for y in range(0, self.N)]

Умножая список, копируйте только ссылки, что, конечно, не то, что я ожидаю:

>>> matrix = [[0] * 5] * 5
>>> matrix
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
>>> matrix[1][1] = "X"
>>> matrix
[[0, 'X', 0, 0, 0], [0, 'X', 0, 0, 0], [0, 'X', 0, 0, 0], [0, 'X', 0, 0, 0], [0, 'X', 0, 0, 0]]

Итак, есть ли какое-либо решение , использующее понимание списка , чтобы избежать избыточных и переменных (x & y)?

Ответы [ 2 ]

5 голосов
/ 01 апреля 2012

Распространенная идиома - присвоить результат переменной _, которая сигнализирует возможному читателю вашего кода, что значение не будет использоваться:

[[0]*self.N for _ in range(self.N)]

Как видите, мы можем использоватьидиома [0]*size для внутреннего списка, потому что 0 является неизменным значением.Кроме того, вы можете вызвать range только с одним аргументом, и в этом случае он рассматривается как верхняя граница, а 0 - нижняя граница).

Если вы хотите, вы можете создать себе помощника по созданию спискаподдерживает создание списков произвольной глубины вложенности:

def make_multi_list(dim, func):
  if not dim: return func()
  return [make_multi_list(dim[1:], func) for _ in range(dim[0])]

Использование:

>>> make_multi_list((2, 2), lambda: 0)
[[0, 0], [0, 0]]
>>> make_multi_list((3, 2, 1), lambda: 0)
[[[0], [0]], [[0], [0]], [[0], [0]]]
1 голос
/ 01 апреля 2012

В качестве альтернативы вы можете сделать:

from itertools import repeat

self.matrix = [list(repeat(0, self.N)) for _ in range(0, self.N)]
...