7

以下は私のスクリプトです。これは基本的に、0で満たされた12x8のゼロ行列を作成します。次に、1つずつ入力します。したがって、列2の行0は5である必要があるとします。これを行うにはどうすればよいですか。以下の例は、私がそれをどのように行ったか、そして間違った(私のニーズのために)出力を示しています:

list_MatrixRow = []
list_Matrix = [] #Not to be confused by what the book calls, optimal alignment score matrix

int_NumbOfColumns = 12
int_NumbOfRows = 8

for i in range (0, int_NumbOfColumns): # Puts Zeros across the first Row
    list_AlignMatrixRow.append(0)
for i in range (0, int_NumbOfRows):
    list_AlignMatrix.append(list_AlignMatrixRow) 
#add the list in another list to make matrix of Zeros
#-------------------THE ACTUAL PROBLEMATIC PART; ABOVE IS FINE(It Works)------------

list_AlignMatrix[2][0] = 5 
# This is what logically makes sense but here is the output 
# which happens but I don't want (there should be all 0s and 
# only one 5 on the cell [2][0]):

[5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
4

4 に答える 4

10

各行は同じサブリストを指しています。これは、同じサブリストを繰り返し追加した結果です。したがって、1つの行を変更すると、他の行も変更することになります。

私はこれを行います:

ncols = 12
nrows = 8
matrix = [[0] * ncols for i in range(nrows)]
matrix[2][0] = 5 

matrix含まれています:

[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [5, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

コーディングスタイルについてはさておき、Pythonではオブジェクトのタイプを名前に含めるのは不適切な形式です。int_NumbOfColumns名前をに変更することを選択しましたncols。より説明的なものが必要な場合は、のようなものを使用してくださいcolumn_count。通常、mixedCase名は使用しないでください。一方、CamelCaseは一般的にクラス名に使用されます。詳細については、PEP 8--Pythonコードのスタイルガイドを参照してください。

編集:Pythonは初めてだとおっしゃっていたので、もう少し説明します。

これはリスト内包です:

matrix = [[0] * ncols for i in range(nrows)]

通常のforループとして記述することもできます。

matrix = []
for i in range(nrows):
    matrix.append([0] * ncols)
于 2012-10-21T03:31:08.763 に答える
5

の各エントリは、同じオブジェクトlist_AlignMatrixへの参照です。マトリックスの行ごとに新しいインスタンスを作成する必要があります。これが何が起こっているかの実例です:list

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

この関数を使用して、のid()各エントリがl2同じオブジェクトへの参照であることを確認できます。

>>> [id(x) for x in l2]
[161738316, 161738316, 161738316]

行リストの新しいコピーを作成するには、次のように2番目のループを書き直すことができます。

for i in range (0, int_NumbOfRows):
    list_AlignMatrix.append(list(list_AlignMatrixRow)) 

次の例に示すように、listコンストラクターはのコピーを作成します。list_AlignMatrixRow

>>> l = range(10)
>>> l2 = list(l)
>>> l == l2
True
>>> l is l2
False
于 2012-10-21T03:21:34.100 に答える
1

を追加list_AlignMatrixRowすると、元のリストへの参照が追加されるだけなので、実際には1つの1-Dリストがあり、マトリックスのすべての行がそれを指しています。新しいリストを作成するには、実際に新しいリストを作成する必要があります。

list_AlignMatrix.append(list(list_AlignMatrixRow))

list_AlignMatrixRowの要素を繰り返してコピーすることにより、リストを作成するlistの呼び出しに注意してください。

于 2012-10-21T03:23:01.227 に答える
1

このような行列を生成するには、Pythonで、すべて0の行を生成する場合は、このようなリスト内包表記を使用する必要があります。

>>> import copy
>>> list_MatrixRow=[0 for i in range(12)]
>>> list_MatrixRow
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

その後、同じ方法でリストのリストを作成できます

list_Matrix = [[0 for j in range(12)] for i in range(8)]

これで、任意の要素を編集できます

>>> list_Matrix[0][2]=12345
>>> list_Matrix[0][2]
12345
>>> list_Matrix
[[0, 0, 12345, 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, 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, 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]]

すべての列5を含む行列を作成する場合は、リスト内包表記で短絡評価を使用できます。

>>> list_MatrixRow=[(i==0 and 5 or 0) for i in range(12)]
>>> list_MatrixRow
[5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>> list_Matrix=[list_MatrixRow for i in range(8)]
>>> list_MatrixRow
[5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>> list_Matrix
[[5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
>>> list_Matrix[0][0]
5    
于 2012-10-21T03:23:57.070 に答える