引用其中的列表内联循环初始化?

时间:2013-03-05 12:16:30

标签: python list for-loop initialization inline

我希望能够写出这样的内容:

x = [0]
x = [x[i-1] for i in range(1,10)]

我知道这个例子没有任何意义。但我想知道是否可以使用以前计算的值,同时以这种方式初始化列表。 (也许是某种lambda表达式)

这是我需要的实际代码:

x = [(b[i] - sum([(a[i][j] * x[j]) for j in range(i)])) / a[i][i] for i in range(n)]

这当然会出现以下错误:

UnboundLocalError: local variable 'x' referenced before assignment

我知道有这种方式:

x = []
for i in range(n):                        
    x.append((b[i] - sum([(a[i][j] * x[j]) for j in range(i)])) / a[i][i])  

但我真的想知道第一个是否有可能。

2 个答案:

答案 0 :(得分:4)

即使有可能,我也不认为你应该尝试这样做。由于嵌套列表理解甚至不是该行的外部部分,因此“详细”三行解决方案已经相当复杂。你还有另外一笔钱。

我实际上甚至将它拆分得更多,以便将列表理解分开:

x = []
for i in range(n):
    k = sum(a[i][j] * x[j] for j in range(i))
    x.append((b[i] - k) / a[i][i])

我相信可能会更多地简化这一点,但是很难说只是通过查看它而没有关于它实际做什么的任何上下文,并且没有a的示例数据,{{ 1}}和b

答案 1 :(得分:3)

虽然我完全同意你想要的不是一个好习惯。有一种方法可以做到(有点)。例如,让我们看看:

x = [1]
z = [x.append(x[i]*2) for i in range(10)]

现在我们自然而已:

>>> print z
[None, None, None, None, None, None, None, None, None, None]

但是,x保留了我们想要的值:

>>> print x
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]

所以你可以采用类似的怪异方式:

x = [some_init_value]
[x.append((b[i] - sum([(a[i][j] * x[j]) for j in range(i)])) / a[i][i]) for i in range(n)]

请注意,x已更改为 inplace ,我们不会将列表理解分配给x,因为列表理解将返回一堆None s。

我想强调这是糟糕。良好实践表明,列表推导不应具有副作用(正如我们所做的那样)。

编辑:显然在CPython< = 2.6中你有这个“生病的黑客”,其中列表理解具有隐藏价值。 eryksun对Fibonacci序列的强大攻击:

fib = [[0,1][j] if j<2 else locals()['_[1]'][j-1] + locals()['_[1]'][j-2] for j in range(10)]

当然,这在CPython 2.7和PyPy上失败了。