Listen in einer Liste

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Chemical Bro
User
Beiträge: 14
Registriert: Freitag 20. November 2015, 11:02

Hallo ich bin neu hier! :)
Freut mich euch kennenzulernen!

Ich hab ein kleines Problem bei meinem Programm:

Wenn ich einen einzelnen Eintrag in einer Liste von Listen ändern will,
also bsw. M[0][3] = 'X',
dann wird anstatt nur den 3. Eintrag in der 0. Liste zu ändern
der 3. Eintrag von jeder Liste in der Liste geändert.

Wie kann ich nun also einen Eintrag in nur einer Liste innerhalb der Liste ändern
ohne die anderen Einträge an der gleichen Stelle in den anderen Listen
zu ändern?

Ich freue mich auf eure Hilfe!
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Chemical Bro: ein vollständig lauffähiges Beispiel wäre schön. Dann bräuchte man nicht raten, was Du falsch machst. Statt n-mal die gleiche Liste in M zu haben, solltest Du n verschiedene Listen erzeugen.
Chemical Bro
User
Beiträge: 14
Registriert: Freitag 20. November 2015, 11:02

Ja, stimmt.
Meine Grundmatrix sieht wie folgt aus:
M = [[' ']*7]*6

Und eine Funktion in dem Programm:

Code: Alles auswählen

def neueMatrix(M,c):
	for i in range(6):
		if M[i][c] == ' ':
			M[i][c] = 'X'
			break
		
	return M
Ich will ein Vier-Gewinnt-Spiel erstellen...
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Das Problem liegt darin wie du `M` erzeugst. Die inneren Listen sind immer diesselbe:

Code: Alles auswählen

In [1]: M = [[' ']*7]*6

In [2]: M
Out[2]: 
[[' ', ' ', ' ', ' ', ' ', ' ', ' '],
 [' ', ' ', ' ', ' ', ' ', ' ', ' '],
 [' ', ' ', ' ', ' ', ' ', ' ', ' '],
 [' ', ' ', ' ', ' ', ' ', ' ', ' '],
 [' ', ' ', ' ', ' ', ' ', ' ', ' '],
 [' ', ' ', ' ', ' ', ' ', ' ', ' ']]

In [3]: for x in M:
   ...:     print(id(x))
   ...:     
140645952792840
140645952792840
140645952792840
140645952792840
140645952792840
140645952792840
stattdessen:

Code: Alles auswählen

In [4]: M = [[None for i in range(7)] for j in range(6)]

In [5]: for x in M:                                     
    print(id(x))
   ...:     
140645952764240
140645952762080
140645952638848
140645952762872
140645952638920
140645952638776
Daneben benutzt man (wenn man denn einen braucht) `None` als Platzhalter.
Chemical Bro
User
Beiträge: 14
Registriert: Freitag 20. November 2015, 11:02

Ah, danke sehr! :D
Erscheint mir logisch.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Alternativ bietet sich ein defaultdict statt einer mehrdimensionalen Liste an. Schlüssel wäre ein 2-tupel (x, y). Das kommt aber auf den Anwendungsfall an.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Antworten