2012-10-21 8 views
6

Unten ist mein Skript, das im Grunde eine Nullmatrix von 12x8 mit 0 gefüllt erstellt. Dann möchte ich es einzeln ausfüllen. Also sagen wir mal, Spalte 2 Zeile 0 muss 5 sein. Wie mache ich das? Das folgende Beispiel zeigt, wie ich es tat, und die falsche (für meine Bedürfnisse) Ausgabe:Zellzuordnung einer 2-dimensionalen Matrix in Python, ohne Nummer

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 jeder! Ich hab es geschafft. Was ich tat, machte eine Liste der gleichen Liste, die alle auf die gleiche Liste verweisen. Danke auch für die richtige Schreibweise in Python. Ich bin neu (4 Wochen) in der Verwendung von Python. Danke allen! – StudentOfScience

Antwort

8

Jede Zeile verweist auf dieselbe Unterliste. Dies ist das Ergebnis des wiederholten Anhängens derselben Unterliste. Wenn Sie also eine Zeile ändern, ändern Sie die anderen Zeilen.

Ich würde dies tun:

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

matrix enthält:

[[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]] 

Exkurs über Stil Codierung: Es ist schlecht in Python Form die Art des Objekts in den Namen aufzunehmen. Ich habe gewählt, int_NumbOfColumns als ncols umzubenennen. Wenn Sie etwas beschreibenderes benötigen, verwenden Sie etwas wie column_count. Im Allgemeinen sollten mixedCase-Namen vermieden werden, während CamelCase generell für Klassennamen verwendet wird. Siehe PEP 8 -- Style Guide for Python Code für mehr.

Bearbeiten: Da Sie erwähnt haben, dass Sie Python neu sind, hier ist ein wenig mehr Erklärung.

Dies ist ein list comprehension:

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

Es ist auch als reguläres for-Schleife geschrieben werden kann:

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

Danke !! es funktionierte!! – StudentOfScience

5

Jeder Eintrag in list_AlignMatrix ist ein Verweis auf das gleiche Objekt. Sie müssen für jede Zeile in Ihrer Matrix eine neue list Instanz erstellen. Hier ist ein Beispiel dafür, was passiert:

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

Sie die id() Funktion verwenden können, um zu bestätigen, dass jeder Eintrag in l2 ist ein Verweis auf das gleiche Objekt:

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

Um neue Kopien Ihrer Reihe Liste zu machen Sie können Ihre zweite Schleife wie folgt umschreiben:

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

der list Konstruktor Kopien von 012.385.332 erstellen, wie das folgende Beispiel verdeutlicht:

>>> l = range(10) 
>>> l2 = list(l) 
>>> l == l2 
True 
>>> l is l2 
False 
+0

Danke! Ich verstehe es jetzt! – StudentOfScience

1

Wenn Sie list_AlignMatrixRow anhängen, es ist nur einen Verweis auf die ursprüngliche Liste angehängt, so dass es wirklich eine einzige 1-D-Liste, und jede Zeile der Matrix zeigt auf es. Um eine neue Liste zu erstellen, müssen Sie tatsächlich eine neue Liste erstellen:

list_AlignMatrix.append(list(list_AlignMatrixRow)) 

Hinweis den Aufruf zur Liste, die durch Iteration über eine Liste erstellt und Kopieren die Elemente von list_AlignMatrixRow

+0

ja! Ich bin Newbee auf Python .. ThankyoU! – StudentOfScience

1

so zu erzeugen, eine Matrix , in python, sollten Sie die Liste comprihention wie diese verwenden, wenn Sie eine Zeile mit allen 0 produzieren wollen,

>>> 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 dann können Sie die Liste Liste in gleicher Weise erstellen

list_Matrix = [[0 für j in Bereich (12)] für i in range (8)]

jetzt können Sie beliebige Elemente bearbeiten

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

Wenn Sie eine Matrix erstellen möchten, die alle Spalte 5 enthält, können Sie die Kurzschlussauswertung auf Listenverständnis

verwenden
>>> 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

kann mir jemand sagen, warum negative Stimmen für meine Antwort !! Ich denke, es gibt nur das Ergebnis, was er will –

+0

Sie sollten auch eine kurze Erklärung geben, warum Sie es so machen müssen (siehe die anderen Antworten). P.S. nicht mein Downvote. – nneonneo

+1

Ich mache keinen Downvote, aber ich denke, es ist klar, warum jemand das getan hat: Das OP versucht zu vermeiden, dass jede Matrixzeile dieselbe identische Zeile ist. Siehe seinen Hinweis "Hier ist die Ausgabe, die passiert, aber ich will nicht". Sie verwenden 'list_MatrixRow' erneut, was Sie in das gleiche Problem bringt, mit dem das OP konfrontiert wurde. – DSM