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. :wink: