Problem mit update() bei Dict's

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.
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Hallo,
Ich möchte in einen Dictionary zwei Werte updaten.
die normale Ausgabe ist so:

Code: Alles auswählen

0, 0
0, 1
0, 2
0, 3
0, 4
1, 1
.
.
.
Wenn ich es ausprinten lasse ist das so, aber ich habe in meinen Dict sind sie nicht so, die Ausgabe ist so:

Code: Alles auswählen

{'action': None, 'y': 4, 'tile': '/gametiles/baum1.png', 'x': 2}
{'action': None, 'y': 4, 'tile': '/gametiles/grass.png', 'x': 3}
{'action': None, 'y': 4, 'tile': '/gametiles/grass.png', 'x': 3}
{'action': None, 'y': 4, 'tile': '/gametiles/grass.png', 'x': 3}
{'action': None, 'y': 4, 'tile': '/gametiles/grass.png', 'x': 3}
{'action': None, 'y': 4, 'tile': '/gametiles/baum1.png', 'x': 2}
{'action': None, 'y': 4, 'tile': '/gametiles/grass.png', 'x': 3}
{'action': None, 'y': 4, 'tile': '/gametiles/grass.png', 'x': 3}
{'action': None, 'y': 4, 'tile': '/gametiles/grass.png', 'x': 3}
{'action': None, 'y': 4, 'tile': '/gametiles/grass.png', 'x': 3}
{'action': None, 'y': 4, 'tile': '/gametiles/grass.png', 'x': 3}
{'action': None, 'y': 4, 'tile': '/gametiles/grass.png', 'x': 3}
{'action': None, 'y': 4, 'tile': '/gametiles/grass.png', 'x': 3}
{'action': None, 'y': 4, 'tile': '/gametiles/grass.png', 'x': 3}
{'action': None, 'y': 4, 'tile': '/gametiles/grass.png', 'x': 3}
{'action': None, 'y': 4, 'tile': '/gametiles/grass.png', 'x': 3}
{'action': None, 'y': 4, 'tile': '/gametiles/baum2.png', 'x': 4}
{'action': None, 'y': 4, 'tile': '/gametiles/grass.png', 'x': 3}
{'action': None, 'y': 4, 'tile': '/gametiles/grass.png', 'x': 3}
{'action': None, 'y': 4, 'tile': '/gametiles/grass.png', 'x': 3}
{'action': None, 'y': 4, 'tile': '/gametiles/baum3.png', 'x': 0}
{'action': None, 'y': 4, 'tile': '/gametiles/grass.png', 'x': 3}
{'action': None, 'y': 4, 'tile': '/gametiles/baum1.png', 'x': 2}
{'action': None, 'y': 4, 'tile': '/gametiles/grass.png', 'x': 3}
{'action': None, 'y': 4, 'tile': '/gametiles/baum2.png', 'x': 4}
Warum? Ich sehe da keine 1, 1 und so.

Hier ist der Code:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

"""
Generate the playingfield
"""
#~Imports

import cPickle as pickle
import random

#~Define arena

height_rows=5
width_cols=5

#~Define images

grass = {"tile" : "/gametiles/grass.png", "action" : None, "x" : None, "y": None}
baum1 = {"tile" : "/gametiles/baum1.png", "action" : None, "x" : None, "y": None}
baum2 = {"tile" : "/gametiles/baum2.png", "action" : None, "x" : None, "y": None}
baum3 = {"tile" : "/gametiles/baum3.png", "action" : None, "x" : None, "y": None}

#~Variables

row=[]
for y in range(height_rows):
    col=[]
    for x in range(width_cols):
        number = random.randint(1, 10)
        if number == 5:
            baum1.update({"x" : x, "y" : y})
            col.append(baum1)      
        elif number == 1:
            baum2.update({"x" : x, "y" : y})
            col.append(baum2) 
        elif number == 7:
            baum3.update({"x" : x, "y" : y})
            col.append(baum3)
        else:
            grass.update({"x" : x, "y" : y})
            col.append(grass)
    row.append(col)
for i in row:
    for i in i:
        print i
name = raw_input("mapname: ")
pickle.dump(row, open("../maps/" + name + ".sav", "wb" ) )
print "fertig"
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
BlackJack

@jtschoch: Du hast da egal wie gross das Spielfeld ist *vier* Wörterbücher und mit den `update()`-Aufrufen veränderst Du immer die selben vier Objekte. Das heisst wenn Du einem `grass.update(…)` zum Beispiel mit den Werten für Feld 1,1 ausführst und später zum Beispiel noch einmal für Feld 2,3 dann ersetzt Du im *selben* Objekt die Werte von vorher.

Du musst vor dem Ändern eine Kopie von dem jeweiligen Wörterbuch erstellen und die dann aktualisieren und dem Spielfeld hinzufügen.

Der Vergleich mit den Zahlen 5, 1, und 7 ist total willkürlich. Da würde ich 1, 2, 3 nehmen, das ist weniger verwirrend und kommt auf das gleiche Ergebnis hinaus.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Wenn es etwas meta sein darf, dann kannst du deine if-Abfrage so zusammen fassen:

Code: Alles auswählen

trees = [ {...}, {...}, {...} ]
...
number = random.randint(0, 9)
if number <= 3:
    to_update = trees[number]
else:
    to_update = grass

to_update.update(...)
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
BlackJack

Das ``if``/``else`` könnte man sich noch sparen wenn man `max()` verwendet.

Code: Alles auswählen

field = field_prototypes[max(randint(9), 4)].copy().update(...)
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Meintest du nicht min?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
BlackJack

@jbs: Ja, meinte ich natürlich. :oops:
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Da kommt aber am ende None raus!

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

"""
Generate the playingfield
"""
#~Imports

import cPickle as pickle
import random

#~Define arena
#5*5 = 25

height_rows=5
width_cols=5

#~Define images
objects =  \
[
{"tile" : "/gametiles/grass.png", "action" : None, "x" : None, "y": None},
{"tile" : "/gametiles/baum1.png", "action" : None, "x" : None, "y": None},
{"tile" : "/gametiles/baum2.png", "action" : None, "x" : None, "y": None},
{"tile" : "/gametiles/baum3.png", "action" : None, "x" : None, "y": None}
]
tiles = 3
#~Variables

row=[]
for y in range(height_rows):
    col=[]
    for x in range(width_cols):
        col.append(objects[min(random.randint(1, 9), tiles)].copy().update({"x" : x, "y" : y}))
    row.append(col)
for i in row:
    for i in i:
        print i
name = raw_input("mapname: ")
pickle.dump(row, open("../maps/" + name + ".sav", "wb" ) )
print "fertig"
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
BlackJack

@jtschoch: Stimmt. Man muss es geringfügig ändern.

Die Namen sind übrigens teilweise schlecht gewählt. `row` steht nicht für *eine* Zeile sondern viele, und `col` steht nicht für eine Spalte, sondern für eine Zeile. Das ist verwirrend.

Von dem `i` in der zweiten ``for``-Schleife auf Modulebene mal ganz zu schweigen. Das ist ziemlich grausam.
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Oh ja, die schleife soll eigentlich gar nicht ausgeprintet werden hab es nur schnell hingeschrieben,
aber das ändert trotzdem nix!

Achso wie könnte ich es sonnst zum Beispiel nennen?
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

jtschoch hat geschrieben:Achso wie könnte ich es sonnst zum Beispiel nennen?
"row" als "rows" und "col" als "row".
Das Leben ist wie ein Tennisball.
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Aber das ändert an den None auch nix!
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du packst doch auch jede Menge Nones rein. Schau dir die Stelle an, bei der die Listen befüllt werden und zerlege Ausdrücke in Teilausdrücke.
Das Leben ist wie ein Tennisball.
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

hä wie, verstehe gerade Bahnhof sorry!
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du sollst dir einfach anschauen was du in cols packst.
Das Leben ist wie ein Tennisball.
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Hä ich pack das rein,

Code: Alles auswählen

col.append(objects[min(random.randint(1, 9), tiles)].copy().update({"x" : x, "y" : y}))
was ist daran falsch?
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Der Rueckgabewert von `dict.update`
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Verstehe das trotzdem noch nicht :(
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Rufe mal im interaktiven Modus ``print({}.update({}))`` auf.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

None, weil der Return None ist, muss ich dann objects adden?
Könnt ihr mir bitte mal eine Lösung oder den richtigen Code schicken habe überhaupt keinen Plan.
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Ich denke, es ist besser die Schritte einzeln durchzuführen. BlackJacks Beispiel ist eher akademisch interessant und nicht unbedingt im Produktiveinsatz zu empfehlen. Code sollte möglichst klar und verständlich für alle sein, auch wenn jeder etwas anderes darunter versteht.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Antworten