2012-03-31 88 views
2

我想用零填满我的matrix。可惜的是,在下面的例子中,变量xy是redundand:通过列表理解创建矩阵时的冗余变量

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]] 

那么,有没有什么办法解决使用列表理解避免redundand变量(x & y)?

+1

@Ashwini:这有帮助吗? – 2012-04-01 00:07:20

+0

如果我没有错,那么他的问题是,当他将一个值添加到特定的列表项时,它也会被添加到列表中名为matrix的其他列表中。 和http://stackoverflow.com/a/8713681/846892解释了列表的这种行为。 – 2012-04-01 00:13:08

+2

@AshwiniChaudhary:他知道那种行为。问题是一个完全不同的问题,虽然... – 2012-04-01 00:13:43

回答

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]]] 
+0

谢谢,这就是我正在寻找!你给我的例子非常好。 – IProblemFactory 2012-04-01 07:19:30

1

或者,你可以这样做:

 
from itertools import repeat 

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

谢谢,你说得对。我已经修复了代码。当语言已支持此功能时,不需要使用重复功能。 – 2012-04-01 00:05:16