Erstellen einer Statistik

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.
r2d2
User
Beiträge: 43
Registriert: Donnerstag 2. März 2006, 23:05
Wohnort: Bielefeld

müsste heissen:

Code: Alles auswählen

if poolabfr == 'n' or poolabfr == 'nein':
bei elif auch

r2d2
äh, nimm diese schlange von meinem hals.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

...denn

Code: Alles auswählen

meinstring = "Hallo"
if meinstring:
    print "wahr!"
ist immer True, da so auf die Existenz von meinstring geprueft wird.
merlin_emrys
User
Beiträge: 110
Registriert: Freitag 3. März 2006, 09:47

Ups...
Danke Euch beiden für die schnelle Hilfe!
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Rebecca hat geschrieben:..., da so auf die Existenz von meinstring geprueft wird.
Möööp. Da hat jemand zu viel PHP oder Perl ohne use strict; programmiert. ;-)

Python kennt sowas wie leere Initialisierung von Namen nicht. Du prüfst ob der Wert wahr ist. Und eine nicht-leere Zeichenkette (die ja an den entsprechenden Namen gebunden ist) ist immer wahr. Wie noch ein paar andere Arten von Objekten, wie zum Beispiel nicht-leere Listen, dicts, tupel, usw.
--- Heiko.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

:oops:
merlin_emrys
User
Beiträge: 110
Registriert: Freitag 3. März 2006, 09:47

So, ein Feiertag hat mir endlich wieder ein paar freie Stunden zum Programmieren geboten. Und falls jemand daran interessiert ist, was bisher aus dem geworden ist, was ich angefangen habe... Ich bin für weitere Hinweise aller Art immer dankbar!

Nochmal zur Information, so gut ich es kurz zusammenfassen kann:
Ich möchte Wertegruppen mit unterschiedlich vielen Werten erzeugen, mit denen dann ein paar Rechenoperationen ausgeführt werden.
1.) Ich möchte die Summe der Werte als Statistik haben.
2.) Ich möchte wissen, ob ein bestimmter "Schwellwert" für die Einzelwerte überschritten wurde.
3.) Für den Fall, dass es einen "Pool" gibt, möchte ich wissen, ob die Abweichung der jeweiligen Werte von ihren Schwellwerten innerhalb des "Pool"-Bereiches liegt.

Es gibt ein paar Stellen, an denen die Verwendung von "def" hilfreich wäre, aber ich schaffe es nicht, die Werte hin- und herzuschieben, d.h. ich komme mit dem def-Befehl noch nicht klar. Dasselbe gilt für Listen, wenn es darum geht, die Werte einzeln miteinander zu vergleichen und festzuhalten, ob ein Wert seinen Schwellwert überschreitet. Das wird wohl warten müssen, bis ich an ein Python-Buch gekommen bin... :(

Code: Alles auswählen

# Programmentwurf
#
# Eingabe und Definition der Anfangswerte
#
anz = int(raw_input("Anzahl Rechenwerte eingeben, Maximum 5: ")) 
ber1 = ber2 = ber3 = ber4 = ber5 = 0
rw1 = sw1 = dif1 = rw2 = sw2 = dif2 =  rw3 = sw3 = dif3 =  rw4 = sw4 = dif4 =  rw5 = sw5 = dif5 =  0
swrel = 1         # Schwellwert-Relation: Schwellwert über/unterschritten?
#
# Weiter mit der Eingabe 
# Bereichsabfrage
#
berabfr = raw_input("Bereich für alle Werte gleich? j_a, n_ein: ")

if berabfr == 'j' or berabfr == 'ja':  
       if anz == 1:
          ber1 = int(raw_input("Gib den Bereich an, Maximum 30: ")) 
       elif anz == 2:
          ber1 = ber2 = int(raw_input("Gib den Bereich an, Maximum 30: ")) 
       elif anz == 3:
          ber1 = ber2 = ber3 = int(raw_input("Gib den Bereich an, Maximum 30: ")) 
       elif anz == 4:
          ber1 = ber2 = ber3 = ber4 = int(raw_input("Gib den Bereich an, Maximum 30: ")) 
       else:     
          ber1 = ber2 = ber3 = ber4 = ber5 = int(raw_input("Gib den Bereich an, Maximum 30: "))

elif berabfr == 'n' or berabfr == 'nein':
   for i in range(anz):
       if i == 1:
          ber1 = int(raw_input("Gib den Bereich an, Maximum 30: ")) 
       elif i == 2:
          ber2 = int(raw_input("Gib den Bereich an, Maximum 30: ")) 
       elif i == 3:
          ber3 = int(raw_input("Gib den Bereich an, Maximum 30: ")) 
       elif i == 4:
          ber4 = int(raw_input("Gib den Bereich an, Maximum 30: ")) 
       else:     
          ber5 = int(raw_input("Gib den Bereich an, Maximum 30: "))
else:
   print "Keine gültige Eingabe"         

#
# Poolabfrage
#
poolabfr = raw_input("Gibt es einen Pool? j_a,n_ein: ")

if poolabfr == 'n' or poolabfr =='nein': 
          pool = 0          

elif poolabfr == 'j' or poolabfr == 'ja': 
          pool_e = raw_input("Gib die Poolgröße an, Maximum 18: ")
          pool = int(pool_e)
          
else: 
   print "Keine gültige Eingabe"
   pool = 0
           
#
# Schwellwertabfrage
#
schwellabfr = raw_input("Gibt es Schwellwerte? j_a,n_ein: ")

if schwellabfr == 'n' or schwellabfr == 'nein': 
          sw1 = sw2 = sw3 = sw4 = sw5 = 0          

elif schwellabfr == 'j' or schwellabfr == 'ja': 
    if anz == 1:
          sw1 = int(raw_input("Gib den Bereich an, Maximum 20: "))
    elif anz == 2:
          sw1 = int(raw_input("Gib den Bereich an, Maximum 20: ")) 
          sw2 = int(raw_input("Gib den Bereich an, Maximum 20: ")) 
    elif anz == 3:
          sw1 = int(raw_input("Gib den Bereich an, Maximum 20: ")) 
          sw2 = int(raw_input("Gib den Bereich an, Maximum 20: ")) 
          sw3 = int(raw_input("Gib den Bereich an, Maximum 20: ")) 
    elif anz == 4:
          sw1 = int(raw_input("Gib den Bereich an, Maximum 20: ")) 
          sw2 = int(raw_input("Gib den Bereich an, Maximum 20: ")) 
          sw3 = int(raw_input("Gib den Bereich an, Maximum 20: ")) 
          sw4 = int(raw_input("Gib den Bereich an, Maximum 20: ")) 
    else:     
          sw1 = int(raw_input("Gib den Bereich an, Maximum 20: ")) 
          sw2 = int(raw_input("Gib den Bereich an, Maximum 20: ")) 
          sw3 = int(raw_input("Gib den Bereich an, Maximum 20: ")) 
          sw4 = int(raw_input("Gib den Bereich an, Maximum 20: ")) 
          sw5 = int(raw_input("Gib den Bereich an, Maximum 20: "))

else: 
   print "Keine gültige Eingabe"
#
# Eingabe ist damit vorläufig beendet
#
# Listen anlegen, Werte setzen
#
ergebnisliste = []
Fallzahl = 0 
unterschwelle = 0
poolnutzung = 0
überschwelle = 0
#
#
# Rechenoperationen ausführen
#

for rw1 in range(1,ber1+1):
   if ber2 > 0:
       
       for rw2 in range(1,ber2+1):
           if ber3 > 0:
               
               for rw3 in range(1,ber3+1):
                   if ber4 > 0:
                       
                       for rw4 in range(1,ber4+1):
                           if ber5 > 0:
                               
                               for rw5 in range(1,ber5+1):
                                   # 5er-Werte bestimmen
                                   i = rw1 + rw2 + rw3 + rw4 + rw5
                                   ergebnisliste.append(i)
                                   Fallzahl = Fallzahl + 1
                                   
                                   # swrel für 5er-Werte feststellen
                                   if rw5 <= sw5:
                                       swrel = 0
                                   else:
                                       swrel = 1
                                   # swrel für 4er-Werte feststellen
                                   if swrel == 0 and rw4 > sw4:
                                       swrel = 1
                                   elif swrel == 0 and rw4 <= sw4:
                                       pass
                                   else:
                                       swrel = 1 
                                   # swrel für 3er-Werte feststellen
                                   if swrel == 0 and rw3 > sw3:
                                       swrel = 1
                                   elif swrel == 0 and rw3 <= sw3:
                                       pass
                                   else:
                                       swrel = 1 
                                   # swrel für 2er-Werte feststellen
                                   if swrel == 0 and rw2 > sw2:
                                       swrel = 1
                                   elif swrel == 0 and rw2 <= sw2:
                                       pass
                                   else:
                                       swrel = 1 
                                   # swrel für 1er-Werte feststellen
                                   if swrel == 0 and rw1 > sw1:
                                       swrel = 1
                                   elif swrel == 0 and rw1 <= sw1:
                                       pass
                                   else:
                                       swrel = 1 
                                   # swrel auswerten
                                   if swrel == 0:
                                       unterschwelle = unterschwelle + 1
                                   else:
                                        if rw5 > sw5:
                                           dif5 = sw5-rw5
                                        if rw4 > sw4:
                                           dif4 = sw4-rw4
                                        if rw3 > sw3:
                                           dif3 = sw3-rw3
                                        if rw2 > sw2:
                                           dif2 = sw2-rw2
                                        if rw1 > sw1:
                                           dif1 = sw1-rw1
                                        difsum = dif1 + dif2 + dif3 + dif4 + dif5 
                                        if difsum <= pool:
                                           poolnutzung = poolnutzung + 1
                                        else:
                                            überschwelle = überschwelle + 1

                           else:
                               # 4erWerte bestimmen
                                   i = rw1 + rw2 + rw3 + rw4 
                                   ergebnisliste.append(i)
                                   Fallzahl = Fallzahl + 1
                                   
                                   # swrel für 4er-Werte feststellen
                                   if rw4 <= sw4:
                                       swrel = 0
                                   else:
                                       swrel = 1
                                   # swrel für 3er-Werte feststellen
                                   if swrel == 0 and rw3 > sw3:
                                       swrel = 1
                                   elif swrel == 0 and rw3 <= sw3:
                                       pass
                                   else:
                                       swrel = 1 
                                   # swrel für 2er-Werte feststellen
                                   if swrel == 0 and rw2 > sw2:
                                       swrel = 1
                                   elif swrel == 0 and rw2 <= sw2:
                                       pass
                                   else:
                                       swrel = 1 
                                   # swrel für 1er-Werte feststellen
                                   if swrel == 0 and rw1 > sw1:
                                       swrel = 1
                                   elif swrel == 0 and rw1 <= sw1:
                                       pass
                                   else:
                                       swrel = 1 
                                   # swrel auswerten
                                   if swrel == 0:
                                       unterschwelle = unterschwelle + 1
                                   else:
                                        if rw4 > sw4:
                                           dif4 = sw4-rw4
                                        if rw3 > sw3:
                                           dif3 = sw3-rw3
                                        if rw2 > sw2:
                                           dif2 = sw2-rw2
                                        if rw1 > sw1:
                                           dif1 = sw1-rw1
                                        difsum = dif1 + dif2 + dif3 + dif4 
                                        if difsum <= pool:
                                           poolnutzung = poolnutzung + 1
                                        else:
                                            überschwelle = überschwelle + 1
                   else:
                       # 3er-Werte bestimmen
                                   i = rw1 + rw2 + rw3 
                                   ergebnisliste.append(i)
                                   Fallzahl = Fallzahl + 1
                                   
                                   # swrel für 3er-Werte feststellen
                                   if rw3 <= sw3:
                                       swrel = 0
                                   else:
                                       swrel = 1
                                   # swrel für 2er-Werte feststellen
                                   if swrel == 0 and rw2 > sw2:
                                       swrel = 1
                                   elif swrel == 0 and rw2 <= sw2:
                                       pass
                                   else:
                                       swrel = 1 
                                   # swrel für 1er-Werte feststellen
                                   if swrel == 0 and rw1 > sw1:
                                       swrel = 1
                                   elif swrel == 0 and rw1 <= sw1:
                                       pass
                                   else:
                                       swrel = 1 
                                   # swrel auswerten
                                   if swrel == 0:
                                       unterschwelle = unterschwelle + 1
                                   else:
                                        if rw3 > sw3:
                                           dif3 = sw3-rw3
                                        if rw2 > sw2:
                                           dif2 = sw2-rw2
                                        if rw1 > sw1:
                                           dif1 = sw1-rw1
                                        difsum = dif1 + dif2 + dif3 
                                        if difsum <= pool:
                                           poolnutzung = poolnutzung + 1
                                        else:
                                            überschwelle = überschwelle + 1
           else:
               # 2er-Werte bestimmen
                                   i = rw1 + rw2
                                   ergebnisliste.append(i)
                                   Fallzahl = Fallzahl + 1
                                   
                                   # swrel für 2er-Werte feststellen
                                   if rw2 <= sw2:
                                       swrel = 0
                                   else:
                                       swrel = 1
                                   # swrel für 1er-Werte feststellen
                                   if swrel == 0 and rw1 > sw1:
                                       swrel = 1
                                   elif swrel == 0 and rw1 <= sw1:
                                       pass
                                   else:
                                       swrel = 1 
                                   # swrel auswerten
                                   if swrel == 0:
                                       unterschwelle = unterschwelle + 1
                                   else:
                                        if rw2 > sw2:
                                           dif2 = sw2-rw2
                                        if rw1 > sw1:
                                           dif1 = sw1-rw1
                                        difsum = dif1 + dif2 
                                        if difsum <= pool:
                                           poolnutzung = poolnutzung + 1
                                        else:
                                            überschwelle = überschwelle + 1
   else:
        # 1er-Werte bestimmen
                                   i = rw1 
                                   ergebnisliste.append(i)
                                   Fallzahl = Fallzahl + 1
                                   
                                   if rw1 <= sw1:
                                       swrel = 0
                                   else:
                                       swrel = 1
                                   if swrel == 0:
                                       unterschwelle = unterschwelle + 1
                                   else: 
                                        dif1 = sw1-rw1
                                        if dif <= pool:
                                           poolnutzung = poolnutzung + 1
                                        else:
                                            überschwelle = überschwelle + 1

#
# damit müsste die Werteliste jetzt je nach Eingabe mehr oder weniger viele Daten enthalten
#
# Ausgabe der Werte:
#
print 'Fallzahl = ', Fallzahl
print 'unterschwelle = ', unterschwelle
print 'poolnutzung = ', poolnutzung
print 'überschwelle = ', überschwelle
if unterschwelle + poolnutzung + überschwelle - Fallzahl != 0:
    print 'Ooops?'

werteliste = dict()
for wert in ergebnisliste: 
   werteliste[wert] = werteliste.get(wert, 0) + 1
print werteliste
Soweit ich bisher sehe, macht das Programm nur im Bereich der Schwellwertvergleiche nicht das, was es sollte. ("überschwelle" wird nie erhöht, sondern die Werte landen alle in Poolnutzung, soweit ich sehe.) Aber das muss warten, bis ich mal wieder Zeit habe (Anfang Mai gibt's wieder Feiertage :-) ).
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

So, damit dir bei deinen naechsten Feiertagen nicht langweilig wird: :D

Deinen Code koennte man ziemlich verkuerzen. Fuer die Eingaben in den Zeilen 76 bis 86 braucht man eigentlich nur 3 Zeilen:

Code: Alles auswählen

anz = 5 #Oder was auch immer...

#Werte eingeben:
sw = []
for i in range(0, anz):
    sw.append(int(raw_input("Gib den Bereich an, Maximum 20: ")))
Das geht dann auch mit beliebig vielen Werten, nicht nur maximal fuenf. So arbeitet man dann mit der Liste von Werten:

Code: Alles auswählen

#auf alle vorhandenen Werte zugreifen:
print "Deine Werte:"
for wert in sw:
    print wert;

#auf einzelne Werte zugreifen:
print "Erster Wert:", sw[0]  #entpricht sw1
print "Zweiter Wert:", sw[1]  #enstpricht sw2

#nicht vorhandene Werte:
try:
    print sw[6] #Gibt's nicht, produziert einen Index-Fehler!
except IndexError:
    print "Diesen Wert gibt es nicht!"
Wenn du so grosse Suffixe benutzt (sw1...sw5, ber1...ber5) und viele Zeilen Code hast, die fast das gleiche machen, dann sind Listen, Tupel und Schleifen deine Freunde! :)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Da hat Rebecca definitiv Recht!

Ich würde das ganze zusätzlich mit etwas mehr Info versehen:

Code: Alles auswählen

anz=2
sw = []

for i in range(0, anz):
    sw.append(int(raw_input(
        "Gib den Bereich %s an, Maximum 20: " % (i+1)
    )))

Generell ist es so. Wenn Sourcecode-Teile sich wiederholen, dann stimmt was nicht bzw. kann man das meist anders optimieren...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten