Variablen Namen in Schleife ansprechen...

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.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Variablen Namen in Schleife ansprechen...

Beitragvon nemomuk » Freitag 7. Dezember 2007, 16:48

Hallo,

folgendes Problem stellt sich mir:
Ich habe Variablennamen, die durchnummeriert sind... und würde diese gerne in einer Schleife ansprechen...

Bsp:

Code: Alles auswählen

for x in range(1,5):
    variable_+x="irgendein wert"


Danke!
BlackJack

Beitragvon BlackJack » Freitag 7. Dezember 2007, 16:52

Lösung: Variablennamen nicht durchnummerieren, sondern eine Liste verwenden.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Beitragvon nemomuk » Freitag 7. Dezember 2007, 16:59

ja, das würde ich gerne, aber ich weiß nicht wie ich das besser anstellen kann in meiner Situation:

Code: Alles auswählen

schafkopfblatt = [
               ["7","Herz"],
               ["8","Herz"],
               ["9","Herz"],
               ["Unter","Herz"],
               ["Ober","Herz"],
               ["Koenig","Herz"],
               ["10","Herz"],
               ["Sau","Herz"],
               
               ["7","Schelln"],
               ["8","Schelln"],
               ["9","Schelln"],
               ["Unter","Schelln"],
               ["Ober","Schelln"],
               ["Koenig","Schelln"],
               ["10","Schelln"],
               ["Sau","Schelln"],
               
               ["7","Eichel"],
               ["8","Eichel"],
               ["9","Eichel"],
               ["Unter","Eichel"],
               ["Ober","Eichel"],
               ["Koenig","Eichel"],
               ["10","Eichel"],
               ["Sau","Eichel"],
               
               ["7","Gras"],
               ["8","Gras"],
               ["9","Gras"],
               ["Unter","Gras"],
               ["Ober","Gras"],
               ["Koenig","Gras"],
               ["10","Gras"],
               ["Sau","Gras"]
            ]

bild_blatt1_1 = PhotoImage(file="irgendein_bild")

for x in schafkopfblatt:
      zahl, farbe = x
      
   spielblatt1_1 = Label(gui,image=bild_blatt1_1)
        etc. (weitere 31 Bilder)

spielblatt1_1.pack()


Ich brauche in diesem Fall 32 Bilder, die Liste mische ich mit shuffle() und dann muss ich der Reihe nach 32 Karten ausgeben und in meiner GUI ausgeben...

Geht das irgfendwie schöner

Danke![/code]
BlackJack

Beitragvon BlackJack » Freitag 7. Dezember 2007, 17:18

Naja, wie schon gesagt: Listen verwenden. So gut wie immer wenn man ``name_nr`` mit verschiedenen Nummern im Quelltext stehen hat, kann man das in ``name[nr] `` umformulieren. Beziehungsweise kann man sich in Python den Index dann oft sparen weil man die Listen mit `append()` erstellen und später direkt über die Elemente iterieren kann.

Das `x` in dem Quelltext kannst Du übrigens einsparen, es geht auch so:

Code: Alles auswählen

for zahl, farbe in schafkopfblatt:
    # ...
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Beitragvon nemomuk » Freitag 7. Dezember 2007, 17:31

Vielen Dank!

Hast duu da vllt. irgendeine Anleitung, finde da grad nichts dazu, weil so gut kenn ich mich jetzt nicht mit Python aus, um aus deiner Erklärung "viel" schlauer zu werden...

Danke!
BlackJack

Beitragvon BlackJack » Freitag 7. Dezember 2007, 18:24

Das Pythontutorial aus der Dokumentation. Oder jedes andere. Listen sind neben Dictionaries wirklich eine der grundlegensten Datenstrukturen in Python.
Benutzeravatar
kaytec
User
Beiträge: 540
Registriert: Dienstag 13. Februar 2007, 21:57

Beitragvon kaytec » Freitag 7. Dezember 2007, 18:59

Hallo SchneiderWeise !

Du kannst in deine Liste gleich den Photoimage-Pfad speichern und musst diesen nicht explizit angeben. Schaue mal www.python-forum.de/topic-12840.html hier.

gruß frank
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Beitragvon nemomuk » Samstag 8. Dezember 2007, 08:21

Danke nochmal...

aber leider komm ich immer noch nicht drauf, wie ich das machen soll, auch nachdem ich das Tutorial angeschaut habe.

Code: Alles auswählen

schafkopfblatt = [
               ["7","Herz","bilder/spielblatt/7_Herz.jpg"],
               ["8","Herz","bilder/spielblatt/8_Herz.jpg"],
               ["9","Herz","bilder/spielblatt/9_Herz.jpg"]
                        ]
for zahl,farbe,pfad in schafkopfblatt:
        spielblatt1_1 = Label(gui,image=pfad)
   spielblatt1_2 = Label(gui,image=pfad)
   spielblatt1_3 = Label(gui,image=pfad)
        #etc. insgesamt 32 Labels...

spielblatt1_1.pack()
spielblatt1_2.pack()
spielblatt1_3.pack()
#etc. insgesamt dann auch 32 Karten


Anstatt diese ganzen Labels hinzuschreiben wurde gesagt, dass ich Listen verwenden soll, aber wie mache ich das?

Vielen Dank!
BlackJack

Beitragvon BlackJack » Samstag 8. Dezember 2007, 10:50

Vor der Schleife erstellst Du eine leere Liste und in der Schleife kommen dort dann die ganzen `Label`-Objekte rein.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 8. Dezember 2007, 10:58

SchneiderWeisse hat geschrieben:Anstatt diese ganzen Labels hinzuschreiben wurde gesagt, dass ich Listen verwenden soll, aber wie mache ich das?

Nein, es wurde gesagt, dass du statt Variablen durchzunummerieren du Listen verwenden sollst.

Und da das Listen schreiben unlustig ist, hier mal eine bessere Lösung. Damit spart man sich die ganzen Pfade immer eingeben zu müssen.

Code: Alles auswählen

farben = set(('Eichel', 'Gras', 'Herz', 'Schellen'))
werte = set(range(6, 11) + ['A', 'O', 'U'])
kombiniert = set()
for farbe in farben:
    for wert in werte:
        kombiniert.add((farbe, wert))

def get_blatt(farbe, wert):
    return "bilder/spielblatt/%s_%s.jpg" % (wert, farbe)

for item in kombiniert:
    print get_blatt(*item)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Beitragvon nemomuk » Samstag 8. Dezember 2007, 13:12

Vielen Dank ihr zwei!

Sehr nett von euch...
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Beitragvon nemomuk » Samstag 8. Dezember 2007, 13:31

spricht eigentlich etwas gegen diese Schreibweise ohne set? (Dann könnte ich nämlioch auch shuffle verwenden...

Code: Alles auswählen

farben = ["Eichel", "Gras", "Herz", "Schelln"]
werte = range(6, 11) + ['Sau', 'Ober', 'Unter']
kombiniert = []
for farbe in farben:
   for wert in werte:
      kombiniert.append([farbe,wert])


ty
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 8. Dezember 2007, 15:23

Es ist etwas langsamer und hmm, shuffle erledigt sich von selbst, da Sets ("Mengen") keine Ordnung besitzen.
Aber ansonsten kannst du auch Listen verwenden, ja.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Beitragvon nemomuk » Samstag 8. Dezember 2007, 15:26

naja, aber für ein Kartenspiel ist shuffle eher besser als set... oder?
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 8. Dezember 2007, 15:43

Ja. Letztendlich funktionieren die ganzen Funktionen des Random-Moduls nicht mit Sets.
My god, it's full of CARs! | Leonidasvoice vs Modvoice

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder