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:
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:
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