1

我希望能够写出这样的东西:

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

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

4

2 回答 2

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清楚。bn

于 2013-03-05T12:27:47.650 回答
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更改的,我们没有将列表推导分配给,因为列表推导将返回一堆s。xNone

我想强调这是不好的。良好实践表明列表推导不应该有副作用(就像我们的那样)。

编辑:显然在 CPython <= 2.6 中你有这个“病态的黑客”,其中列表理解有一个隐藏的值。eryksun对斐波那契数列的绝妙破解:

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 上失败了。

于 2013-03-05T12:35:17.447 回答