Seite 1 von 1

Dictionary/Liste Problem

Verfasst: Montag 14. August 2006, 09:09
von m3t3or
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]


Verfasst: Montag 14. August 2006, 10:26
von keppla
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

Verfasst: Montag 14. August 2006, 14:28
von Michael Schneider
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

Verfasst: Montag 14. August 2006, 20:08
von m3t3or
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

Verfasst: Montag 14. August 2006, 20:48
von Michael Schneider
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

Verfasst: Montag 14. August 2006, 21:06
von m3t3or
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

Verfasst: Montag 14. August 2006, 21:55
von BlackJack
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.

Verfasst: Montag 14. August 2006, 22:52
von Michael Schneider
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