通过列表理解创建矩阵时的冗余变量

时间:2012-03-31 23:54:57

标签: python list-comprehension

我正在尝试用零填充matrix。不幸的是,在以下示例中,变量xy是冗余的:

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 个答案:

答案 0 :(得分:5)

常见的习惯用法是将结果分配给变量_,该变量向代码的可能读者发出信号,告知该值不会被使用:

[[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 :(得分:1)

或者,您可以这样做:

from itertools import repeat

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