我正在尝试用零填充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
)?
答案 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)]