Wert aus Liste auslesen

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
bloody1337
User
Beiträge: 9
Registriert: Samstag 5. Juni 2010, 14:11

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 ;)
Zuletzt geändert von Anonymous am Samstag 5. Juni 2010, 14:32, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
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.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Mit Hilfe von 'list comprhehension' lässt sich die Funktion ''werfen'' auch in nur einen Zeilen ausdrücken.
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.
bloody1337
User
Beiträge: 9
Registriert: Samstag 5. Juni 2010, 14:11

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.


--------------
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@BlackJack: Hast recht. Ich hatte irgendwie was anderes im Kopf. :oops:
@bloody1337: Du solltest dir das offizielle Tutorial mal anschauen.
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.
bloody1337
User
Beiträge: 9
Registriert: Samstag 5. Juni 2010, 14:11

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
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

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)
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.
bloody1337
User
Beiträge: 9
Registriert: Samstag 5. Juni 2010, 14:11

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
Antworten