Seite 1 von 1
problem mit zweidimensionalen dicts
Verfasst: Montag 20. November 2006, 19:23
von Costi
hi2all
es geht um einen ASCII spielbrett:
Code: Alles auswählen
>>> spielfeld = 2 * [3 * [' ']]
>>> spielfeld
[[' ', ' ', ' '], [' ', ' ', ' ']]
>>> spielfeld[1][1] = "X"
>>> spielfeld
[[' ', 'X', ' '], [' ', 'X', ' ']]
>>>
allerdings wird dabei zweimal x gestezt, dabei dachte ich das man bei zweidimensionale dicts man sozusagen wie im koordinatensystem nach x und y setzt? und dieses ergebniss ist fuer mich irgendwie nicht logisch nachvolziebar
danke leutz
Verfasst: Montag 20. November 2006, 19:37
von swoehrl
Hi.
Der Fehler dürfte am *-Zeichen liegen. Wenn ich das so mache, geht es.
Code: Alles auswählen
>>>sp = [['','',''],['','','']]
>>>sp[1][1] = "X"
>>>sp
[['', '', ''], ['', 'X', '']]
Du hast die Initialisierung wohl als Schleife gedacht, aber Python nimmt das "*" nicht als Schleife, sondern mathematisch.
Gruß
SWoehrl
Verfasst: Montag 20. November 2006, 19:42
von swoehrl
Oder hier als Schleifenversion:
Code: Alles auswählen
>>>sp = [[' ' for j in range(3)] for i in range(2)]
>>>sp
[[' ', ' ', ' '], [' ', ' ', ' ']]
Grüße
SWoehrl
Re: problem mit zweidimensionalen dicts
Verfasst: Montag 20. November 2006, 20:42
von BlackJack
Costi hat geschrieben:hi2all
es geht um einen ASCII spielbrett:
Code: Alles auswählen
>>> spielfeld = 2 * [3 * [' ']]
>>> spielfeld
[[' ', ' ', ' '], [' ', ' ', ' ']]
>>> spielfeld[1][1] = "X"
>>> spielfeld
[[' ', 'X', ' '], [' ', 'X', ' ']]
>>>
allerdings wird dabei zweimal x gestezt, dabei dachte ich das man bei zweidimensionale dicts man sozusagen wie im koordinatensystem nach x und y setzt? und dieses ergebniss ist fuer mich irgendwie nicht logisch nachvolziebar
'X' wird nur einmal gesetzt. Und zwar in der *selben* Liste! Listen multiplizieren erzeugt keine Kopien sondern nur Referenzen.
Code: Alles auswählen
In [9]: spielfeld
Out[9]: [[' ', ' ', ' '], [' ', ' ', ' ']]
In [10]: spielfeld[0] is spielfeld[1]
Out[10]: True
In [11]: spielfeld = [[' '] * 3 for dummy in xrange(2)]
In [12]: spielfeld[0] is spielfeld[1]
Out[12]: False
Verfasst: Dienstag 21. November 2006, 20:49
von Costi
puh, die initialisierung sieht dan so aus:
Code: Alles auswählen
spielfeld = eval(('[' + x * ('[' + (y-1) * ('" ",') + '" "' + ']' ) + ']').replace("][", "],["))
Verfasst: Dienstag 21. November 2006, 21:48
von Joghurt
Nein, nein, nein! Kein eval nehmen! Das ist hässlich, unleserlich und in 99% der Fälle unnötig (so auch hier)
Wie wäre es damit?
Code: Alles auswählen
def createBoard(width, height):
retval = []
for y in xrange(height):
retval.append([' ']*width)
return retval
Aber eigentlich bietet sich sowas an:
Code: Alles auswählen
class Spielfeld(dict):
def __getitem__(self, key):
return self.get(key, ' ')
spielfeld = Spielfeld()
spielfeld[(1,2)] = 'X'
print spielfeld[(1,2)], spielfeld[(5,1)] # 'X' ' '
for x in xrange(10):
for y in xrange(10):
print spielfeld[(x,y)],
Verfasst: Dienstag 21. November 2006, 22:19
von mitsuhiko
Und um nach was dranzuhängen: Das sind Listen keine Dicts. Zweidimensional sind sie auch nicht, aber verschachtelt.