Anfängerproblem: Dictionary mit 0-Werten erzeugen und Werte mit Liste erhöhen.

Code-Stücke können hier veröffentlicht werden.
Antworten
EFFiZ
User
Beiträge: 5
Registriert: Mittwoch 12. Februar 2020, 10:08

Sonntag 1. März 2020, 16:20

Liebes Forum,

ich habe ein kleines Programm geschrieben, dass Lotto 6 aus 49 ohne Superzahl simuliert:

Code: Alles auswählen

import random

Schluessel = []
Schluessel[0:48] = range(1,50)
Werte = []
for i in range(50):
    Werte.append(0)

Dictionary_Lottozahlen = dict(zip(Schluessel, Werte))
gezogene_Kugeln = 0

print("Bitte geben Sie die Anzahl der Lottoziehungen ein:")
eingabe = int(input())
print()

for x in range(eingabe):
    
    lottozahlen = []
    lottozahlen[0:48] = range(1,50)

    zug = 0
    ziehung = []

    while zug < 6:
        zug += 1
               
        # Ziehung der Zahl
        zahl = random.choice(lottozahlen)
        ziehung.append(zahl)
        lottozahlen.remove(zahl)

        Dictionary_Lottozahlen[zahl] += 1
        gezogene_Kugeln += 1
        
# Ausgabe in Tabelle
print(f"{'Zahl':>4}{'Gezogen':>9}{'rel. Häufigk.':>15}")
for x in Dictionary_Lottozahlen:
    print(f"{x:4d}{Dictionary_Lottozahlen[x]:>9}{Dictionary_Lottozahlen[x] / gezogene_Kugeln * 100:15f}")

print()
print("Insgesamt gezogenen Kugeln:")
print(gezogene_Kugeln)
Dabei bin ich auf zwei Probleme gestoßen, die ich nicht lösen konnte bzw. nur indirekt.

1. Ist es möglich, das Dictionary "Dictionary_Lottozahlen" direkter und gleich mit allen Werten = 0 zu erzeugen? Also gibt es einen Befehl, der sagt, alle Values im erzeugten Dict sind gleich 0?

2. Unabhängig davon, ob das im vorliegenden Fall sinnvoll ist, hatte Ich eigentlich vor, die einzelne Ziehung als Liste auszugeben, um dann mit dieser Liste die Werte im Dictionary zu beeinflussen. Also wenn ich mit der while-Schleife eine Liste ziehung = [2, 5, 7, 34, 6, 45] erzeuge, dann möchte ich, dass die Werte im Dictionary für die Keys 2, 5, 6, 7, 34, 45 sich um jeweils +1 erhöhen? Das sollte doch auch irgendwie machbar sein.

Danke für die Auskunft!
Sirius3
User
Beiträge: 11982
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 1. März 2020, 16:45

Variabelnnamen schreibt man klein_mit_unterstrich.
Statt

Code: Alles auswählen

Schluessel = []
Schluessel[0:48] = range(1,50)
würde man

Code: Alles auswählen

schluessel = list(range(1,50))
schreiben.
Statt

Code: Alles auswählen

Werte = []
for i in range(50):
    Werte.append(0)
schreibt man

Code: Alles auswählen

werte = [0] * 50
Statt

Code: Alles auswählen

Dictionary_Lottozahlen = dict(zip(Schluessel, Werte))

Code: Alles auswählen

lottozahlen = range(1,50)
anzahl_ziehungen_pro_zahl = dict.fromkeys(lottozahlen, 0)
Was Du statt eines Wörterbuchs benutzen eigentlich möchtest ist collection.Counter.

Statt while-Schleife ist da eine for-Schleife besser:

Code: Alles auswählen

lottozahlen = list(range(1,50))
ziehung = []
for zug in range(6):
    # Ziehung der Zahl
    zahl = random.choice(lottozahlen)
    ziehung.append(zahl)
    lottozahlen.remove(zahl)
    anzahl_ziehungen_pro_zahl[zahl] += 1
Statt der for-Schleife ist random.sample besser.

Code: Alles auswählen

ziehung = random.sample(lottozahlen, 6)
Zusammen sieht das so aus:

Code: Alles auswählen

import random
from collections import Counter

lottozahlen = range(1,50)
anzahl_ziehungen_pro_zahl = Counter()
print("Bitte geben Sie die Anzahl der Lottoziehungen ein:")
runden = int(input())
for _ in range(runden):
    ziehung = random.sample(lottozahlen, 6)
    anzahl_ziehungen_pro_zahl.update(ziehung)

# Ausgabe in Tabelle
gesamt_anzahl = sum(anzahl_ziehungen_pro_zahl.values())
print(f"{'Zahl':>4}{'Gezogen':>9}{'rel. Häufigk.':>15}")
for zahl in lottozahlen:
    print(f"{zahl:4d}{anzahl_ziehungen_pro_zahl[zahl]:>9}{anzahl_ziehungen_pro_zahl[zahl] / gesamt_anzahl:15.2%}")
Antworten