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

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

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: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

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

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: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

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

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

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: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

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 ...
Antworten