1

私はプロジェクトオイラー問題15をやっています。適切なアルゴリズムを使用しましたが、機能していないようです。これが私のコードです:

f = [[0] * 21] * 21

# init the list
for i in range(21):
    f[0][i] = 1
    f[i][0] = 1

for i in range(21):
    for j in range(21):
        f[i][j] = f[i-1][j] + f[i][j-1]

print f[20][20]

リストの初期化が完了したら、それを印刷しました。と思っていたのです[[1, 1, 1...], [1, 0, 0...]...]が、向きが変わっ[[1, 1, 1...], [1, 1, 1...]...]て理由がわかりません。

以前はCのような言語を使用していましたが、PythonのリストはCの配列に似ていると思ったので、同じように使用しました。

4

2 に答える 2

4

リストを乗算するときは、個別のリストを作成するのではなく、同じリストへの複数の参照を作成します。

代わりに、これを行います。

f = [[0 for _ in range(21)] for _ in range(21)] 

id()次の関数を使用すると、違いがわかります。

>>> f = [[0]*21]*21
>>> for nested in f[:3]:
...     print id(nested)
... 
4523317152
4523317152
4523317152
>>> f = [[0 for _ in range(21)] for _ in range(21)] 
>>> for nested in f[:3]:
...     print id(nested)
... 
4523317512
4523317440
4523317656

個別のオブジェクトには個別のメモリID値がありますが、リストの結果は呼び出しごとに同じid()であり、すべて同じリストであることを示しています。

于 2012-12-09T14:42:35.580 に答える
0

最初の行で、これを使用します:

f = [[0] * 21 for _ in xrange(21)]

あなたが書いたものは長さ21のリストを作成し(それは内部が行うことです)、次に同じ内部リストを21回[0]*21含む外部リストを作成します。これは、内部リストの要素を変更するたびに、すべてのコピー、つまりマトリックスのすべての行で変更されることを意味します。

価値があるものについては、モジュールをチェックアウトすることをお勧めします(もちろん最初にNumPynumpyをインストールします)。これにより、「適切な」n次元配列構造が得られます。

于 2012-12-09T14:40:45.090 に答える