problem mit zweidimensionalen dicts

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
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Montag 20. November 2006, 19:23

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
cp != mv
swoehrl
User
Beiträge: 3
Registriert: Donnerstag 9. November 2006, 16:54

Montag 20. November 2006, 19:37

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
swoehrl
User
Beiträge: 3
Registriert: Donnerstag 9. November 2006, 16:54

Montag 20. November 2006, 19:42

Oder hier als Schleifenversion:

Code: Alles auswählen

>>>sp = [[' ' for j in range(3)] for i in range(2)]
>>>sp
[[' ', ' ', ' '], [' ', ' ', ' ']]
Grüße
SWoehrl
BlackJack

Montag 20. November 2006, 20:42

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
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Dienstag 21. November 2006, 20:49

puh, die initialisierung sieht dan so aus:

Code: Alles auswählen

spielfeld = eval(('[' + x * ('[' + (y-1) * ('" ",') + '" "' + ']' ) + ']').replace("][", "],["))
cp != mv
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Dienstag 21. November 2006, 21:48

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)],
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Dienstag 21. November 2006, 22:19

Und um nach was dranzuhängen: Das sind Listen keine Dicts. Zweidimensional sind sie auch nicht, aber verschachtelt. :wink:
TUFKAB – the user formerly known as blackbird
Antworten