2012-10-21 5 views
6

以下は私のスクリプトです。これは基本的に0で満たされた12x8のゼロ行列を作成します。次に、それを1つずつ書きたいと思います。だから、列2の行0は5である必要があると言うことができます。どうすればいいですか?以下の例では、私はそれをやった方法を示していますし、間違って(私のニーズのための)出力:numpyのないPythonでの2次元行列のセル割り当て

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] 
+0

のTHXみんなを!わかった。私がやっていたことは、同じリストのすべてを指すリストを作ることでした。また、Pythonでの適切な記述方法にも感謝します。私はPythonを使用するために新しい(4週間)です。皆さんありがとう! – StudentOfScience

答えて

8

各行は同じサブリストを指します。これは同じサブリストを繰り返し追加した結果です。したがって、ある行を変更すると、他の行が変更されます。私はこれだろう

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 -- Style Guide for Python Codeを参照してください。

を編集してください:あなたはあなたがPythonの初心者だと述べたので、もう少し説明します。

これはlist comprehensionです:

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

また、forループの正規のように書くことができます。

matrix = [] 
for i in range(nrows): 
    matrix.append([0] * ncols) 
+0

ありがとうございました!出来た!! – StudentOfScience

5

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

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

あなたはl2内の各エントリは、同じオブジェクトへの参照であることを確認するid()機能を使用することができます。

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

あなたの行リストの新しいコピーを作成するには、あなたはこのようなあなたの第二のループを書き換えることができます。

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 
+0

ありがとう!わかった! – StudentOfScience

1

、それだけで元のリストへの参照を追加していますので、シングル1-Dのリストは、実際にそこだし、あなたの行列のすべての行を指していますそれ。

list_AlignMatrix.append(list(list_AlignMatrixRow)) 

注このようなマトリックスを生成するための反復処理とlist_AlignMatrixRow

+0

はい!私はpythonのnewbee ..ありがとう! – StudentOfScience

1

の要素をコピーして、リストを作成し、一覧表示するための呼び出し、新しいリストを作成するには、実際に新しいリストを作成する必要がありますあなたはすべて0と行を生成したい場合は、Pythonで、あなたはこの のようなリストcomprihentionを使用する必要があり、

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

CE 、あなたは同じように

をリストのリストを作成することができます

list_Matrix = [0範囲のiについての範囲(12)におけるJ](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]] 

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

>>> 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  
+0

誰でも私の答えの否定投票をなぜ教えてもらえますか?私はそれがちょうど彼が望んでいる結果を与えると思う。 –

+0

あなたはこのようにしなければならない理由の簡単な説明を提供するべきである(他の答えを見てください)。 P.S.私のdownvoteではありません。 – nneonneo

+1

私はdownvoteをしませんが、なぜ誰かがしたのは明らかです:OPは*すべての行列行を同じ同じ行にすることを避けようとしています。彼のメモ "ここでは起こる出力がありますが、私はしたくありません"を参照してください。 'list_MatrixRow'を再利用すると、OPが出たのと同じ問題が発生します。 – DSM

関連する問題