Seite 1 von 1

Wert aus Liste auslesen

Verfasst: Samstag 5. Juni 2010, 14:22
von bloody1337
Hallo liebe Gemeinde,

vorab,ich bin ein armer mathestudent und muss mich nun mit dem programmieren rumplagen ^^

ich habe nicht viel ahnung,aber ich habe schon etwas probiert zu schreiben...

es geht um ein programm zu zufallszahlen. ein würfel mit 4,6,8,10,12 oder 20 seiten soll n- mal gewürfelt werden.
dabei soll n eingelesen werden,dann folgt die simulation und zuletzt die ausgabe der ergebnisse.
ich habe bislang das:

Code: Alles auswählen

import random

n= input('Wie oft soll der Würfel geworfen werden?:')
e= input('Wieviel Seitenflächen soll der Würfel haben?4,6,8,10,12 oder 20 Seiten?:')


def werfen(n,e):
    k=0
    daten = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
    while k<n:
        z=int(e*random.random()) +1
        daten[z-1]=daten[z-1]+1
        k=k+1
    return daten

print
print werfen(n,e);


print

nun mein anliegen.das programm läuft soweit und die liste wird korrekt ausgegeben,hat bislang bei allen versuchen geklappt.

nun möchte ich gerne noch genau die jeweilige zahl einzeln aus der liste ausgeben in folgender form:

"Die Anzahl der Einsen: ..."
"Die Anzahl der Zweien:..."
... usw.

ich habe da schon was mit dem befehl:
einsen=daten[0]
print "Die Anzahl der Einsen:",einsen - oder so ähnlich probiert,aber das haut nicht hin.


würde mich über ratschläge oder korrekturen freuen,
danke bloody ;)

Re: Wert aus Liste auslesen

Verfasst: Samstag 5. Juni 2010, 14:46
von BlackJack
@bloody1337: Warum klappt das nicht? Das sollte es nämlich.

Sonstige Anmerkungen: `input()` sollte man unter Python 2.x meiden, weil dort beliebiege Python-Ausdrücke eingegeben werden können, die ausgewertet werden. Neben den Sicherheitsaspekten die sich daraus ergeben können, ist es auch schwierig geziehlte Fehlerbehandlung zu betreiben, weil wirklich *alles* passieren kann bis zu einem `SyntaxError` wenn jemand kein gültiges Python eingibt.

Die Länge der `daten` sollte von `e` abhängen. Wenn jemand 30 dafür eingibt, reicht die Liste so nicht mehr aus und wenn jemand weniger als 20 eingibt, sind da unnötige Einträge enthalten. In dem Zusammenhang: Man kann Listen mit ganzen Zahlen "multiplizieren":

Code: Alles auswählen

In [1193]: [0] * 20
Out[1193]: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Wenn man vor dem Eintritt in eine Schleife schon weiss wie oft sie durchlaufen werden wird, nimmt man eine ``for``-Schleife. Damit spart man sich die Initialisierung und das manuelle Hochzählen der Laufvariablen und macht das Programm übersichtlicher.

Das `random`-Modul bietet auch schon fertige Funktionen die ganze Zahlen aus einem gegebenen Intervall liefern.

Das hochzählen eines Listeneintrags kann man mit dem ``+=``-Operator kürzer schreiben. Dann braucht auch der um 1 verschobene Index nicht zweimal berechnet werden.

Wenn die deutschen Zahlwörter nicht zwingend erforderlich sind, bietet sich für die Ausgabe auch wieder eine ``for``-Schleife an. Und zwar über die Liste und in Verbindung mit der `enumerate()`-Funktion.

Den Code auf Modulebene solltest Du auch noch in einer Funktion verschwinden lassen und mit folgendem Idiom starten:

Code: Alles auswählen

if __name__ == '__main__':
    main()
So kann man das Modul zum Beispiel in einer Python-Shell importieren und einzelne Funktionen austesten oder verwenden ohne das die Funktion `main()` ausgeführt wird. Die wird in dem Fall nur dann ausgeführt, wenn das Modul direkt als Programm gestartet wird.

Re: Wert aus Liste auslesen

Verfasst: Samstag 5. Juni 2010, 14:57
von gkuhl
Mit Hilfe von 'list comprhehension' lässt sich die Funktion ''werfen'' auch in nur einen Zeilen ausdrücken.

Re: Wert aus Liste auslesen

Verfasst: Samstag 5. Juni 2010, 15:20
von BlackJack
@gkuhl: Das bezweifle ich. Man kann da höchstens eine LC missbrauchen um das in eine Zeile zu quetschen, wobei man das hier auch mit einer normalen ``for``-Schleife machen könnte. Aber das Ergebnis der LC würde man nicht verwenden können.

Re: Wert aus Liste auslesen

Verfasst: Samstag 5. Juni 2010, 15:27
von bloody1337
hey,

schon einmal danke für die ausführlichen und schnellen hinweise!!

jedoch bin ich gezwungen noch anzumerken,dass es bei dem programm wirklich nur um die funktionalität geht, die frage nach ästhetik besteht nicht!!

daher schätze ich deine antwort BlackJack, klingt ja auch wirklich alles ganz gut, aber verstanden habe ich da ehrlich nicht viel. der grund liegt da aber sicher bei mir,weil ich die befehle,"verhaltensmuster" etc. von python nicht kenne.ist ja mein erstes programm.hätte ich vielleicht dazu schreiben sollen. an dem programm sitz ich ja jetzt auch schon 3 stunden :S

also wenn ich das mit mit dem auslesen probieren: "einsen=daten[0]...print einsen"

kommt der fehler:
Traceback (most recent call last):
File "C:\Program Files\pyton\Aufgabebearbeiten.pyw", line 15, in <module>
einsen=daten[0]
NameError: name 'daten' is not defined
also liegt es vielleicht daran,wo ich diese "auslesezeile" hinschreibe?

habe schon ein paar stellen probiert...entweder kommt dieser fehler,oder es kommt kein fehler,wobei das spezielle auslesen nicht angezeigt wird.


--------------

Re: Wert aus Liste auslesen

Verfasst: Samstag 5. Juni 2010, 16:17
von gkuhl
@BlackJack: Hast recht. Ich hatte irgendwie was anderes im Kopf. :oops:
@bloody1337: Du solltest dir das offizielle Tutorial mal anschauen.

Re: Wert aus Liste auslesen

Verfasst: Samstag 5. Juni 2010, 16:34
von BlackJack
@bloody1337: Der Name muss natürlich in dem Namensraum wo man ihn verwendet bekannt sein. Namen die innerhalb von Funktionen an Werte gebunden werden, sind auch nur innerhalb der jeweiligen Funktion bekannt. Du gibst die Liste am Ende der Funktion ja zurück. Da wo Du sie aufrufst, kannst Du das Ergebnis ja wieder an einen Namen binden. Und über den kann man dort dann auch darauf zugreifen.

Unterschied ``for``- und ``while``-Schleife und wann man welche am besten verwendet mag zwar bis zu einem gewissen Grad "Ästhetik" sein, aber das sind absolute Grundlagen.

Re: Wert aus Liste auslesen

Verfasst: Samstag 5. Juni 2010, 17:23
von bloody1337
hehe, ok stimmt mit dem for und while ;)

habe mich zu sehr auf das mit dem main und 20*[0] versteift.

kannst du mir bitte für eine ziffer,bspw. '3' die 1-2 zeilen in mein programm einbauen,
damit ich sehe,wie es funktioniert und ob.
die restlichen zahlen sind ja dann analog.

vielen dank für euer bemühen =)

dann noch einen schönen samstag
grüße

Re: Wert aus Liste auslesen

Verfasst: Samstag 5. Juni 2010, 20:42
von DaMutz

Code: Alles auswählen

import random
zahlen_worte = ['Einsen', 'Zweien', 'Dreien', 'Vieren', 'Fuenfen', 'Sechsen']

def main():
    n = 1000
    e = 6

    daten = werfen(n, e)
    for i in range(e):
        print("Die Anzahl der {0}: {1}".format(zahlen_worte[i], daten[i]))

if __name__ == '__main__':
    main()
die 'werfen'-Funktion habe ich einmal weggelassen. Auch die Eingabe per Konsole habe ich entfernt. Für 6 Zahlen habe ich die Ausgabe (Worte) definiert. Damit solltest du in der Lage sein, den rest zu implementieren.

Die int Zufallszahlen kannst du folgendermassen generieren:

Code: Alles auswählen

z = random.randint(1, e)

Re: Wert aus Liste auslesen

Verfasst: Samstag 5. Juni 2010, 20:46
von BlackJack
@bloody1337: Ich denke das solltest Du selber herausfinden. Das sind Grundlagen, die Du Dir zum Beispiel über das Tutorial in der Python-Dokumentation erarbeiten kannst.

Re: Wert aus Liste auslesen

Verfasst: Sonntag 6. Juni 2010, 11:30
von bloody1337
heya..!!

also dann,danke für alle antworten!

auch wenn sie mir nicht weitergeholfen haben :lol:
mir geht es nicht darum das programmieren zu lernen,ich brauch nur das/die (das buffonsche programm bspw. auch) programme für einen obligatorischen vortrag..

aber das ist mir nun auch egal,jetzt will ich das schöne wetter genießen und ihr bestimmt auch !

nur kurz nochmal zum thema.. wenn ich! auf meine taktik,also ohne for-anweisungen oder irgendwelchen tricks, die werte aus der list entnehmen möchte kommt entweder:

1) nix, weil meine anweisung: print("anzahl...:")+str(daten[0]) o.ä. wohl in der while-schleife ist und da untergeht od.
2) werden werte angezeigt,die nicht zur liste passen .bsp.: [3,4,2,....] --> Anzahl der Einsen : 5


aber nun gut,das mit der expliziten ausgabe der gewürfelten Zahlen ist eigentlich eh nur zusatz.

also dann,
schönen sonntag