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.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

merlin_emrys hat geschrieben: Problem:
Wenn ich das Programm testen lasse, moniert Python für Zeile 53:
. There's an error in your program:
. expected an intended block

Was auch immer Python hier erwartet - ich weiss es nicht. "intended block" taucht auf, wenn die Einrückung nicht stimmt? Aber nicht weiter eingerückt gibt den gleichen Fehler.
In deinem ersten Programm stimmen die Eintrueckungen nicht.
Erstens sollten die else immer die gleiche Einrueckung haben wie das if, zu dem sie gehoeren. Ausserdem muss in der Zeile nach einem def auch eine Einrueckung sein (was in Zeile 53 nicht der Fall ist --> Fehlermeldung!)

Merke: In Zeilen nach ":" kommt immer eine Einrueckung. Die Editoren, die Python koennen, machen das meist auch von alleine.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Zu deinem Zaehlproblem: Eine Loesung ist:

Code: Alles auswählen

werteliste = []
for i in ergebnisliste:
     werteliste.append(ergebnisliste.count(i))
Dein Fehler: %s, %i etc. sind in strings einzusetzen, und koennen nicht fuer sich stehen. Z.B. (der einfachheit halber ohne for-Schleife):

Code: Alles auswählen

meine_liste.count("%d" % 4)

Das ist das gleiche wie

Code: Alles auswählen

meine_liste.count("4")

Es wird also das Auftreten des STRINGS "4" gezaehlt, du willst aber das Auftreten der ZAHL 4 zaehlen:

Code: Alles auswählen

meine_liste.count(4)
Mann muesste also den String "4" noch in einen Integer konvertieren. Ueblicherweise macht man das mit int("4").

Ich muss gestehen, dass ich den eleganten Einzeiler, den du versucht hast, gerade auch nicht richtig hinbekomme, aber obiger Dreizeiler geht ja auch. :)
BlackJack

merlin_emrys hat geschrieben:

Code: Alles auswählen

# Programmentwurf
#
# Eingabe der Anfangswerte
#
anz = input("Anzahl Rechenwerte eingeben, Maximum 5: ")
# 
# damit brauche ich maximal die Variablen ber1 bis ber5
#
ber1 = ber2 = ber3 = ber4 = ber5 = 0
`input()` kann gefährlich sein, weil man dort gültiges Python eingeben kann, was dann ausgeführt wird. In Deinem Fall nicht so schlimm wenn Du der einzige bist, der das Programm benutzt, aber wenn das auch mal "Endbenutzer" in die Hände bekommen, sollte man `raw_input()` nehmen und die Zeichenkette die dort zurückgeliefert wird, explizit in eine Zahl (`int()` oder `float()`) umwandeln.

Für Deine Bereiche kannst Du eine Liste nehmen:

Code: Alles auswählen

In [2]:ber = [0] * 5

In [3]:ber
Out[3]:[0, 0, 0, 0, 0]

In [4]:ber[0]
Out[4]:0

In [5]:ber[2]
Out[5]:0
Dann fängt die Numerierung zwar bei 0 an, aber man kann sie auch "programmatisch", also zum Beispiel in einer Schleife vornehmen.

Code: Alles auswählen

# 
# Weiter mit der Eingabe
#   
berabfr = input("Bereich für alle Werte gleich? 1=ja, 2=nein: ")
if berabfr == 1: 
       if anz == 1:
          ber1 = input("Gib den Bereich an, Maximum 30: ") 
       elif anz == 2:
          ber1 = ber2 = input("Gib den Bereich an, Maximum 30: ") 
       elif anz == 3:
          ber1 = ber2 = ber3 = input("Gib den Bereich an, Maximum 30: ") 
       elif anz == 4:
          ber1 = ber2 = ber3 = ber4 = input("Gib den Bereich an, Maximum 30: ") 
       else:     
          ber1 = ber2 = ber3 = ber4 = ber5 = input("Gib den Bereich an, Maximum 30: ")
Hier würde ich nicht zwischen der Anzahl der Bereiche unterscheiden. Warum nicht einfach alle auf den eingegebenen Wert setzen?

Code: Alles auswählen

In [7]:ber = [int(raw_input('Bereich:'))] * 5
Bereich:10

In [8]:ber
Out[8]:[10, 10, 10, 10, 10]

Code: Alles auswählen

elif berabfr == 2:
   for i in range(anz):
       if i == 1:
          ber1 = input("Gib den Bereich an, Maximum 30: ") 
       elif i == 2:
          ber2 = input("Gib den Bereich an, Maximum 30: ") 
       elif i == 3:
          ber3 = input("Gib den Bereich an, Maximum 30: ") 
       elif i == 4:
          ber4 = input("Gib den Bereich an, Maximum 30: ") 
       else:     
          ber5 = input("Gib den Bereich an, Maximum 30: ")
Hier hätte man jetzt einen Vorteil davon, das die Bereiche in einer Liste stehen: Man kann sie in einer Schleife abfragen.

Code: Alles auswählen

elif berabfr == 2:
   for i in xrange(anz):
       ber[i] = int(raw_input('Gib den Bereich an, Maximum 30: '))
Immer wenn Du fast identischen Quelltext öfter wiederholst, ist das ein Warnsignal dafür, dass *Du* etwas tust, was Du auch dem Rechner übertragen kannst.

Die Schleife und die Liste machen nicht nur weniger Tipparbeit, sondern erhöhen auch die Wartbarkeit des Programms. Stell Dir in beiden Varianten mal vor an wievielen Stellen Du etwas ändern müsstest, wenn Du Beispielsweise 10 Bereiche oder ein anderes Maximum haben möchtest.

Code: Alles auswählen

# erstellt eine liste mit 150 variablen, alle mit 0 initialisiert 
ergebnisliste = []
Der Kommetar ist so nicht richtig. Da oben wird nur eine leere Liste, d.h. eine mit 0 Einträgen angelegt. Analog zur Bereichsliste kann man so 150 Nullen in eine Liste packen:

Code: Alles auswählen

ergebnisliste = [0] * 150
Was ich dann bekomme, ist:
>>>
Anzahl Rechenwerte eingeben, Maximum 5: 2
Bereich für alle Werte gleich? 1=ja, 2=nein: 1
Gib den Bereich an, Maximum 30: 4
[2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7, 5, 6, 7, 8]
[2, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 8]
>>>
Jetzt müsste ich diese Liste "durchzählen".
Dafür habe ich den Befehl "count" entdeckt. Das Problem ist: Entweder ich versuche es mit einem if / elif / else-Berg von ergebnisliste.count(1), ergebnisliste.count(2) usw. bis ergebnisliste.count(150), oder ich versuche es mit einer Iteration, wie ihn das Wiki-Tutorium benutzt:

Code: Alles auswählen

neueListe = [ "X%sX" % i for i in l]
Nur: In keinem Anfänger-Tutorial wird mir verraten, wie man mit diesem % umgeht. Und aus den Beispielen, die ich finde, werde ich nur begrenzt schlau: % ist ein Platzhalter für etwas, was danach noch genauer definiert wird. Die Library Reference verrät mir, daß das kleine "s" für String-Variable steht und bietet mir für Integer zwei Möglichkeiten an: d und i.
Aber ich komme nicht dahinter, wie die Formulierung aussehen muß.
Die Platzhalter für Zeichenkettenformatierung brauchst Du bei Deinem Problem erstmal gar nicht. Du möchtest ja Zahlen zählen und nichts mit Zeichenketten anstellen.

Code: Alles auswählen

werteliste = [ergebnisliste.count(%d) % i for i in ergebnisliste]

ist es jedenfalls nicht; ich bekomme einen Syntax error für das % in ergebnisliste.count(%d).
Den hat Dir Rebecca ja schon erklärt. Aber letztendlich ist das nicht das was Du möchtest. Das Ergebnis hat nämlich genau so viele Einträge wie `ergebnisliste` und ausserdem ist das mit dem `count()` nicht so effizient weil für jeden Eintrag die gesamte Liste durchlaufen werden muss. Der Zeitaufwand dafür wächst quadratisch mit der Länge der Liste.

Mit Deiner sortierten Beispielliste von oben sähe das so aus:

Code: Alles auswählen

In [11]:ergebnisliste = [2, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 8]

In [12]:[ergebnisliste.count(i) for i in ergebnisliste]
Out[12]:[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 2, 2, 1]
Du brauchst zum Zählen eher eine Abbildung, also ein Dictionary wo ein Wert auf die Häufigkeit seines Auftretens abgebildet wird.

Code: Alles auswählen

In [13]:histogramm = dict()

In [14]:for wert in ergebnisliste:
   .14.:    histogramm[wert] = histogramm.get(wert, 0) + 1
   .14.:

In [15]:histogramm
Out[15]:{2: 1, 3: 2, 4: 3, 5: 4, 6: 3, 7: 2, 8: 1}

In [16]:histogramm[5]
Out[16]:4
Ansonsten würde ich Dir raten die einzelnen Teile Deines Programms in Funktionen zu verpacken. Dann kannst Du das Programm im interaktiven Interpreter importieren und die Funktionen sozusagen "live" und einzeln ausprobieren.

Und Du kannst auch mit den eingebauten Datentypen rumspielen um ein Gefühl dafür zu bekommen wie die funktionieren.

Code: Alles auswählen

In [22]:d = dict()

In [23]:help(d)
Help on dict object:

class dict(object)
 |  dict() -> new empty dictionary.
 |  dict(mapping) -> new dictionary initialized from a mapping objects
 |      (key, value) pairs.
 |  dict(seq) -> new dictionary initialized as if via:
 |      d = {}
 |      for k, v in seq:
 |          d[k] = v
 |  dict(**kwargs) -> new dictionary initialized with the name=value pairs
 |      in the keyword argument list.  For example:  dict(one=1, two=2)
...

In [24]:d['hallo'] = 10

In [25]:d
Out[25]:{'hallo': 10}

In [26]:d['hallo']
Out[26]:10

In [27]:d['blah']
---------------------------------------------------------------------------
exceptions.KeyError                 Traceback (most recent call last)

/home/bj/<ipython console>

KeyError: 'blah'

In [28]:help(d.get)
Help on built-in function get:

get(...)
    D.get(k[,d]) -> D[k] if k in D, else d.  d defaults to None.

In [29]:d.get('hallo', 0)
Out[29]:10

In [30]:d.get('blah', 0)
Out[30]:0
merlin_emrys
User
Beiträge: 110
Registriert: Freitag 3. März 2006, 09:47

Rebecca hat geschrieben:Zu deinem Zaehlproblem: Eine Loesung ist:

Code: Alles auswählen

werteliste = []
for i in ergebnisliste:
     werteliste.append(ergebnisliste.count(i))
Ich glaube, i muss im "range(1,150)" sein, aber damit haut es dann hin. Vielen Dank! :-)
Rebecca hat geschrieben:Dein Fehler: %s, %i etc. sind in strings einzusetzen, und koennen nicht fuer sich stehen.
Ups... danke für den Tip, das hatte ich bisher nicht begriffen. Und danke für den Hinweis betr. der Einrückung nach einem Doppelpunkt. Ich hatte sowas vermutet, war mir aber keineswegs sicher. Nur in dem speziellen Fall von Zeile 53 hat Python zu meiner Verwirrung beide Versionen nicht akzeptiert... Die zitierte Version war die geänderte, ursprünglich hatte ich die Einrückung aus r2d2s Vorschlag schon mit übernommen.
BlackJack hat geschrieben:`input()` kann gefährlich sein, weil man dort gültiges Python eingeben kann, was dann ausgeführt wird. In Deinem Fall nicht so schlimm wenn Du der einzige bist, der das Programm benutzt, aber wenn das auch mal "Endbenutzer" in die Hände bekommen, sollte man `raw_input()` nehmen und die Zeichenkette die dort zurückgeliefert wird, explizit in eine Zahl (`int()` oder `float()`) umwandeln.
Ich bezweifele, dass irgendjemand dies Programm interessant finden wird... aber Hinweise auf gute Programmierpraxis kann ich auch noch sehr gut gebrauchen. Danke! Ich werde die entsprechenden Befehle noch einfügen.
BlackJack hat geschrieben:Hier würde ich nicht zwischen der Anzahl der Bereiche unterscheiden. Warum nicht einfach alle auf den eingegebenen Wert setzen?
Wenn ich Deine Frage richtig verstehe, müsste die Antwort mit genau dieser Überlegung zusammenhängen:
BlackJack hat geschrieben:Immer wenn Du fast identischen Quelltext öfter wiederholst, ist das ein Warnsignal dafür, dass *Du* etwas tust, was Du auch dem Rechner übertragen kannst.
Das ist mir bewußt. In ScionImage würde ich dann einfach hingehen, beispielsweise eine sogenannte "procedure" mit dem Namen "Ergebnisermittlung" oder so erstellen und an den entsprechenden Stellen einfach nur "Ergebnisermittlung" durchführen lassen. Aber in Python heisst das wohl nicht "procedure"... Ich vermute, es ist der "def"-Befehl? An dem lerne ich noch...
Aber kurz zurück: Wenn ich die "Ergebnisermittlung" verallgemeinere, müssen (glaube ich, aber ich bin Anfänger) die "nicht benötigten" Bereiche auf Null gesetzt bleiben, damit nur so viele Schleifen abgearbeitet werden, wie auch in der Anzahl zu Anfang eingegeben wurden. Alternativ fiele mir ein, innerhalb der "Auswerte-Schleifen" statt über

Code: Alles auswählen

if ber4 > 0:
die Abfrage über anz gehen zu lassen:

Code: Alles auswählen

if anz>= 4
BlackJack hat geschrieben:Der Kommetar ist so nicht richtig.
Ups, stimmt. Den hatte ich beim Umschreiben des Programms übersehen... Ist geändert.
BlackJack hat geschrieben:Du brauchst zum Zählen eher eine Abbildung, also ein Dictionary wo ein Wert auf die Häufigkeit seines Auftretens abgebildet wird.
Wie erwähnt, wenn ich es mit range(1,150) versuche, bekomme ich das von mir erwartete Ergebnis. Die Sache mit dem dictionary gefällt mir aber noch besser, weil sie vor jeder Angabe mitteilt, um welchen Wert es geht. Sonst macht es doch viel Arbeit, wenn ich nachzählen muss, wie der Wert für 123 nun ist! :-)

Danke nochmal für die Hilfe!
merlin_emrys
User
Beiträge: 110
Registriert: Freitag 3. März 2006, 09:47

Ich hab' leider immer noch nicht alles ausprobieren können, aber derzeit hänge ich an einem Problem, das ich nicht verstehe. Offenbar mache ich einen Fehler in der Abfrage von Werten, die ich per raw_input zugewiesen habe.

Code: Alles auswählen

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

if poolabfr == 'n' or 'nein': 
          pool = 0          
elif poolabfr == 'j' or 'ja': 
          pool_e = raw_input("Gib die Poolgröße an, Maximum 20: ")
          pool = int(pool_e)
else: 
     print "Keine gültige Eingabe"
     pool = 20

print 'pool = ', pool
print poolabfr
Beim Programmdurchlauf wird immer die erste Bedingung als "wahr" festgestellt, egal was ich eingebe; ich bekomme z.B.

Code: Alles auswählen

>>> 
Gibt es einen Pool? j_a,n_ein: j
pool =  0
j
>>> 
Laut Tutorial müsste es aber so gehen...?
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