2

次のように、Pythonで3次元のNNNリスト作成しようとしています。

n=3
l = [[[0,]*n]*n]*n

残念ながら、これは私が思っていたように、リストを適切に「複製」していないようです。

>>> l
[[[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]
>>> l[0][0][0]=1
>>> l
[[[1, 0, 0], [1, 0, 0], [1, 0, 0]], [[1, 0, 0], [1, 0, 0], [1, 0, 0]], [[1, 0, 0], [1, 0, 0], [1, 0, 0]]]

私はここで何が間違っているのですか?

4

5 に答える 5

5

問題は* n、リストの浅いコピーを実行することです。解決策は、ネストされたループを使用するか、numpyライブラリを試すことです。

于 2009-12-11T16:14:45.450 に答える
4

3次元行列を使用して数値処理を行う場合は、numpyを使用することをお勧めします。それは非常に簡単です:

>>> import numpy
>>> numpy.zeros((3,3,3), dtype=numpy.int)
array([[[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]],

       [[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]],

       [[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]]])
>>> _[0,0,0]
0
于 2009-12-11T21:45:43.577 に答える
3

他の人が述べているように、それはクローンではなく、参照を使用して2番目と3番目のレベルを構築しています。試す:

>>> n = 3

>>> l = [[[0]*n for _ in xrange(n)] for _ in xrange(n)]

>>> l[0][0][0] = 1

>>> l
[[[1, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]

または、少し少なく入力したい場合:

>>> l = [[[0]*n for _ in '.'*n] for _ in '.'*n]
于 2009-12-11T16:18:58.800 に答える
2

リストのクローンを作成していません。同じリストへの参照を何度も挿入しています。ネストされたforループのセットを使用してリストを作成してみてください。

于 2009-12-11T16:13:46.407 に答える
2

leonardo-santagadaが提案したことを次に説明する必要があります。さらに、N次元の配列/リストの作成は非常に非Python的であり、データをどのように保持しているかを再検討し、クラスまたはリストに適切に属していないかどうかを確認する必要があります。辞書(またはリストの辞書)。

于 2009-12-11T21:56:44.460 に答える