我希望能够写出这样的内容:
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])
但我真的想知道第一个是否有可能。
答案 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上失败了。