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

problem mit zweidimensionalen dicts

Beitragvon Costi » 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

Beitragvon swoehrl » 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

Beitragvon swoehrl » 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

Re: problem mit zweidimensionalen dicts

Beitragvon 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

Beitragvon Costi » 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
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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

Beitragvon mitsuhiko » 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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder