1

私はこのようなものを書くことができるようにしたいと思います:

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

この例が意味をなさないことはわかっています。しかし、この方法でリストを初期化しながら、以前に計算された値を使用できるかどうかを知りたいです。(おそらくある種のラムダ式)

これが私が必要とする実際のコードです:

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

たとえそれが可能だったとしても、それをやろうとするべきではないと思います。「冗長」な 3 行のソリューションは、その行の外側の部分でさえないネストされたリスト内包表記のために、すでに非常に複雑です。そして、あなたは別の金額を中に持っています。

私は実際にそれをさらに分割して、次のようにリスト内包表記を個別に持つことさえしたいと思います:

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にくいbですn

于 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はその場で変更され、リスト内包表記は一連xの を返すため、リスト内包表記を に割り当てないことに注意してくださいNone

これは悪いことだと強調したい。グッド プラクティスでは、リスト内包表記に副作用があってはならない (私たちが持っているような) べきではないと述べています。

編集:どうやら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 に答える