Dictionary/Liste Problem

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.
m3t3or
User
Beiträge: 18
Registriert: Donnerstag 16. Februar 2006, 11:21

Dictionary/Liste Problem

Beitragvon m3t3or » Montag 14. August 2006, 09:09

Hallo,

ich möchte ein Programm schreiben, was mir einen Trainingsplan ( für Anstoss 2007, falls es von Interesse ist) erstellt.
zweikampf, tackling, fuenf_gegen_zwei, etc sind Trainingseinheiten, bei denen die Werte Kondition,Frische, etc. um den angegebenen Wert erhöht/gesenkt werden.

Als Ergebnis möchte ich für jeden Tag und für die Woche den Gesamtwert von Kondition, Frische,etc. (natürlich nur von den verwendeteten Trainingseinheiten)
Mein Ansatz ist eine verschachtelte for/if-Konstruktion, bei der ich den Überblick verloren habe.

Gibt es sowas ähnliches schon?
Wer kann mir bitte einen Schubs in die richtige Richtung geben?

Danke

Code: Alles auswählen

zweikampf={"Kondition":1,"Frische":-1,"Zweikampf":2}
tackling={"Kondition":1,"Frische":-1,"Zweikampf":2,"Technik":0}
fuenf_gegen_zwei={"Kondition":0,"Frische":0,"Technik":0}
schusskraft={"Kondition":-1,"Frische":0,"Torschuss":2}
alleingaenge={"Kondition":0,"Frische":-1,"Technik":1,"Herauslaufen":0}
technik={"Kondition":-1,"Frische":1,"Technik":2,"Ballsicherheit":1}
gymnastik={"Kondition":-1,"Frische":1}
radfahren={"Kondition":1,"Frische":0}
schnelligkeit={"Kondition":0,"Frische":-1,"Schnelligkeit":2}

Montag=[zweikampf,tackling,fuenf_gegen_zwei]
Dienstag=[schusskraft,alleingaenge,technik]
Mittwoch=[gymnastik,radfahren,schnelligkeit]
Donnerstag=[zweikampf,fuenf_gegen_zwei,schusskraft]
Freitag=[technik,radfahren,schnelligkeit]
Sonnabend=[schusskraft,alleingaenge,gymnastik]
Sonntag=[zweikampf,technik,radfahren]

Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Beitragvon keppla » Montag 14. August 2006, 10:26

ich weis nicht, ob ich dich korrekt verstanden habe, aber ich glaube, du meinst sowas:

Code: Alles auswählen

#hier dein code

# funktion zur addition zweier trainingseinheiten
def add(left, right):
   return {
      'Kondition' : left['Kondition'] + right['Kondition'],
      'Frische' : left['Frische'] + right['Frische'],
      'Zweikampf' : left['Zweikampf'] + right['Zweikampf'],
   }

woche = (montag, dienstag, mittwoch, donnerstag, freitag, sonnabend, sonntag)

start = 0 # montag
end = 6 # sonntag

# eine liste aller trainignseinheiten für den zeitraum start/end erstellen
total_training = []
for tag in woche[start:end]:
  total_training.extend(tag)

result = reduce(add, total_training)
print result


Das ganze ist ohne gewähr und ungetestet
Benutzeravatar
Michael Schneider
User
Beiträge: 566
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Montag 14. August 2006, 14:28

Hi,

der Code ist etwas umfangreicher.

Code: Alles auswählen

zweikampf={"Kondition":1,"Frische":-1,"Zweikampf":2}
tackling={"Kondition":1,"Frische":-1,"Zweikampf":2,"Technik":0}
fuenf_gegen_zwei={"Kondition":0,"Frische":0,"Technik":0}
schusskraft={"Kondition":-1,"Frische":0,"Torschuss":2}
alleingaenge={"Kondition":0,"Frische":-1,"Technik":1,"Herauslaufen":0}
technik={"Kondition":-1,"Frische":1,"Technik":2,"Ballsicherheit":1}
gymnastik={"Kondition":-1,"Frische":1}
radfahren={"Kondition":1,"Frische":0}
schnelligkeit={"Kondition":0,"Frische":-1,"Schnelligkeit":2}

dWochenplan = { "Montag":[zweikampf,tackling,fuenf_gegen_zwei],
            "Dienstag":[schusskraft,alleingaenge,technik],
            "Mittwoch":[gymnastik,radfahren,schnelligkeit],
            "Donnerstag":[zweikampf,fuenf_gegen_zwei,schusskraft],
            "Freitag":[technik,radfahren,schnelligkeit],
            "Sonnabend":[schusskraft,alleingaenge,gymnastik],
            "Sonntag":[zweikampf,technik,radfahren]}

class Plan:
   lWoche = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Sonnabend", "Sonntag"]
   lAttribute = [   "Kondition", "Frische", "Zweikampf", "Technik", "Torschuss",
               "Schnelligkeit", "Herauslaufen", "Ballsicherheit"]
   dStartZustand = dict([(s, 0) for s in lAttribute])
   
   def __init__(self):
      self.iStartTag = 0
      self.iDauerWochen = 1
      
   def set_start(self,   iStartTag):
      """Legt den Starttag fest, Tagnamen oder 0=Montag, ..., 6=Sonntag"""
      if type(iStartTag) is type(""): self.iStartTag = self.lWoche.index(iStartTag)
      else: self.iStartTag = iStartTag
      
      
   def set_dauer(self, iDauerWochen):
      """Legt die Dauer des Trainings in Wochen fest"""
      self.iDauerWochen = iDauerWochen
      
   def set_zustand(self, dStartZustand):
      """Legt den Startzustand der Mannschaft fest
      
         benoetigte Werte: Kondition, Frische, Zweikampf,
                           Technik, Torschuss, Schnelligkeit,
                      Herauslaufen, Ballsicherheit"""
      self.dStartZustand.update(dStartZustand)
   
   def addiere(self, dStand, lAdd):
      for dStatusAenderungen in lAdd:
         for sAttribut, iAenderung in dStatusAenderungen.items():
            dStand[sAttribut] += iAenderung
      return dStand

   def berechne(self):
      """Berechnet den Zustand fuer jeden Tag"""
      dZustand = self.dStartZustand.copy()

      for iTag in range(self.iDauerWochen * 7):
         dZustand = self.addiere(dZustand,
                           dWochenplan[self.lWoche[(self.iStartTag+iTag) % 7]])

         ##   Ausgabe direkt, koennte man auch in Methode auslagern
         if iTag%7==6:
            print "Ende Woche %i" % (iTag/7+1)
            print 40 * "="
         print "Tag %i (Wochentag %s):" % (iTag+1, self.lWoche[(self.iStartTag+iTag)%7])
         for sAttribut, iWert in dZustand.items():
            print sAttribut, ":", iWert
         if iTag%7==6:
            print 2 * (40 * "=" + "\n")
         print
      
plan = Plan()              ##  Instanz erstellen
plan.set_start("Montag")   ##  Startwochentag festlegen
plan.set_dauer(2)          ##  Anzahl der Wochen festlegen
plan.berechne()            ##  Ergebnis berechnen


Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
m3t3or
User
Beiträge: 18
Registriert: Donnerstag 16. Februar 2006, 11:21

Beitragvon m3t3or » Montag 14. August 2006, 20:08

Danke für die Mühe die Ihr euch gemacht habt, aber das ist nicht so ganz was ich möchte.
Macht aber nix, habs selber raus :D

Kann man an dem Code noch was verbessern?

Danke

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-

trainingsspiel={"Kondition":0,"Frische":0,"Alle Torwartfähigkeiten":0,"Alle Spielintelligenzwerte":1}
spielintelligenz={"Kondition":0,"Frische":0,"Alle Spielintelligenzwerte":1}
pressing={"Kondition":1,"Frische":-2,"Zweikampf":1,"Pressing":2}
passspiel={"Kondition":0,"Frische":-1,"Passspiel":1,"Technik":0}
konterspiel={"Kondition":0,"Frische":-1,"Schnelligkeit":1,"Zweikampf":1}
flexibilitaet={"Kondition":1,"Frische":0,"Spielaufbau":1}
abseitsfalle={"Kondition":-1,"Frische":0,"Abseitsfalle":2}
kopfball={"Kondition":0,"Frische":-1,"Kopfball":2,"Reflexe":1}
flanken={"Kondition":0,"Frische":-1,"Flanken":1,"Kopfball":0}
schussgenauigkeit={"Kondition":0,"Frische":-1,"Flanken":2}
zweikampf={"Kondition":1,"Frische":-1,"Zweikampf":2}
tackling={"Kondition":1,"Frische":-1,"Zweikampf":2,"Technik":0}
fuenf_gegen_zwei={"Kondition":0,"Frische":0,"Technik":0}
schusskraft={"Kondition":-1,"Frische":0,"Torschuss":2}
alleingaenge={"Kondition":0,"Frische":-1,"Technik":1,"Herauslaufen":0}
technik={"Kondition":-1,"Frische":1,"Technik":2,"Ballsicherheit":1}
gymnastik={"Kondition":-1,"Frische":1}
radfahren={"Kondition":1,"Frische":0}
schnelligkeit={"Kondition":0,"Frische":-1,"Schnelligkeit":2}
kraftraum={"Kondition":1,"Frische":-1,"Torschuss":1}
schwimmen={"Kondition":1,"Frische":0}
waldlauf={"Kondition":1,"Frische":-1}
kondition={"Kondition":2,"Frische":-1}
zirkeltraining={"Kondition":2,"Frische":-3}
leichte_ausdauer={"Kondition":0,"Frische":0}
taktikschulung={"Kondition":-1,"Frische":1,"Alle Spielintelligenzwerte":0}
straftraining={"Kondition":2,"Frische":-2,"Disziplin":2}
torwarttraining={"Kondition":0,"Frische":0,"Alle Torwartfähigkeiten":1}
elfmeter={"Kondition":-1,"Frische":1,"Flanken":0,"Torschuss":0}
freistoesse={"Kondition":0,"Frische":0,"Torschuss":1,"Flanken":1}
ecken={"Kondition":-1,"Frische":1,"Flanken":1,"Kopfball":1}
standards={"Kondition":-1,"Frische":1,"Flanken":1,"Kopfball":1}
frische={"Kondition":-1,"Frische":2}
frei={"Kondition":0,"Frische":0}
fussballtennis={"Stimmung":1}

mo=[]
di=[]
mi=[]
do=[]
fr=[]
sa=[]
so=[]

#montag=[pressing,passspiel,konterspiel]
#dienstag=[standards,frische,elfmeter]
mitwoch=[gymnastik,alleingaenge,pressing]
#...

# die entsprechenden tage einsetzen
for einheit in mitwoch:
    for paar in einheit.items():
        mi.append(paar)

werte={}
for element in mi:
    werte.setdefault(element[0],0)
    print element
    werte[element[0]]+=element[1]

print werte
Benutzeravatar
Michael Schneider
User
Beiträge: 566
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Montag 14. August 2006, 20:48

Hallo,

gerade wenn man noch im Aufbau ist, könnte ich mir eine Matrixdefinition ganz gut vorstellen:

Code: Alles auswählen

tKurz = ("Ko","Fr","AT","AS","Zw","Pr","Pa","Te","Sc","SA","AF","KB","Re","Fl","TS","HL","BS","Di","St")
tLang = ("Kondition","Frische","Alle Torwartfaehigkeiten","Alle Spielintelligenzwerte",
         "Zweikampf","Pressing","Passspiel","Technik","Schnelligkeit","Spielaufbau",
         "Abseitsfalle","Kopfball","Reflexe","Flanken","Torschuss","Herauslaufen",
         "Ballsicherheit","Disziplin","Stimmung")
dAttribut = dict(zip(tKurz, tLang))

#                               "Ko Fr AT AS Zw Pr Pa Te Sc SA AF KB Re Fl TS HL BS Di St"
dUebungen = {"Spielintelligenz":"+1 -2 +0 +0 +1 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0",
             "Passspiel"       :"+0 -1 +0 +0 +1 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0",
             #...
             "Tackling"        :"+1 -1 +0 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0"}
for k, v in dUebungen.items():
# EDIT:
#    dUebungen[k] = dict(filter(lambda x:x[1], zip(tLang,map(lambda x:int(x), v.split(" ")))))
# das zweite lambda ist ueberfluessig, so ist es besser:
    dUebungen[k] = dict(filter(lambda x:x[1], zip(tLang,map(int, v.split(" ")))))

print dUebungen

Ist aber reine Geschmackssache.

Grüße,
Michael
Zuletzt geändert von Michael Schneider am Montag 14. August 2006, 22:50, insgesamt 2-mal geändert.
Diese Nachricht zersört sich in 5 Sekunden selbst ...
m3t3or
User
Beiträge: 18
Registriert: Donnerstag 16. Februar 2006, 11:21

Beitragvon m3t3or » Montag 14. August 2006, 21:06

Na hoppla,
ich versteh nur bahnhof. :shock:

ich fang doch gerade erst mit python an. Das mit dem Matrixdingens ist mir im Moment noch ein bischen zu heftig.
Egal, der Code macht das, was er machen soll, so wie er es machen soll. 8)
Jetzt muß das ganze "nur" noch schön grafisch verpackt werden und als Sahnehäubchen obendrauf wird der Trainingsplan als Datei abgespeichert.

Ich weiß noch nicht genau, was die Werte der einzelnen Trainingseinheiten bedeuten( statt 1 wird +, statt -2 wird -- angegeben). Aber wenn nur vier Eigenschaften angegeben sind, dann sollen in der Auswertung auch nur vier Eigenschaften erscheinen, und nicht alle.

Danke für die Aufmerksamkeit
BlackJack

Beitragvon BlackJack » Montag 14. August 2006, 21:55

Michael Schneider hat geschrieben:

Code: Alles auswählen

for k, v in dUebungen.items():
    dUebungen[k] = dict(filter(lambda x:x[1], zip(tLang,map(lambda x:int(x), v.split(" ")))))
print dUebungen


Da ist ein Lambda zuviel, ``map(int, v.split(" "))`` hätte gereicht.
Benutzeravatar
Michael Schneider
User
Beiträge: 566
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Montag 14. August 2006, 22:52

Hi BlackJack,

Du hast völlig recht, keine Ahnung wie das da reingerutscht ist... Vielleicht weil ich es vorn brauchte und hinten nicht mehr nachdachte. :D

Habe die Stelle mit einem entsprechenden Kommentar gekennzeichnet.

Danke und Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...

Wer ist online?

Mitglieder in diesem Forum: Google [Bot]