Problem mit Liste

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
chell
User
Beiträge: 21
Registriert: Sonntag 24. September 2006, 08:45

Guten Tag!

Ich habe mir eben ein kleines Pythonskript geschrieben, dass beliebig oft jeweils 6 Zufallszahlen zwischen 1 und 49 ausgibt (Stichwort: Lotto). Hier das Skript:

Code: Alles auswählen

import random 
anzahl_durchlauf = input("Bitte die Anzahl der Durchlaeufe eingeben: ")
counter = 0
while counter < anzahl_durchlauf:
    for i in range(6):
            lotto_nummern = range(1,49)
            zufallsindex = random.randint(1,50)
            print lotto_nummern[zufallsindex]
            lotto_nummern.pop(zufallsindex)
    print "\n"        
    counter += 1
input("Eine beliebige Taste zum Beenden betaetigen!")
Es funktioniert auch wunderbar, nur manchmal kommt folgende Fehlermeldung:

Code: Alles auswählen

    print lotto_nummern[zufallsindex]
IndexError: list index out of range
Dabei bezieht Python sich auf Zeile 8. Ich weiß, was der Fehler bedeutet, nämlich das auf ein Listenelement zugegriffen wird, das es nicht gibt. Leider verstehe ich nicht, wie es da zu dem Fehler kommen kann. Ich habe gerade entdeckt, dass das Löschen des letzten Listindexes da schwachsinn ist, da die Liste ja neu generiert wird. Habe mich da wohl verannt. Der Algorithmus stimmt wohl auch nicht so ganz...
Danke,

chell
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Code: Alles auswählen

import random
anzahl_durchlauf = input("Bitte die Anzahl der Durchlaeufe eingeben: ")
counter = 0
while counter < anzahl_durchlauf:
    lotto_nummern = range(1,50)
    for i in range(6):
            zufallsindex = random.randint(0,49)
            print lotto_nummern[zufallsindex]
            lotto_nummern.pop(zufallsindex)
    print "\n"       
    counter += 1
input("Eine beliebige Taste zum Beenden betaetigen!")
erstens musst du einfach nur die lottonummernliste kurz vorher generieren,
>>> a = range(1,50)
>>> print a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]
>>> a[0]
1
>>> a[48]
49
zweitens bist du mit den indizien durcheinandergeraten.
sowohl in range() als auch mit der mit randint() produzierten zahl.
denn von dieser nun richtig produzierten liste ist der letzte listenindex schließlich 48. daher musst du auch mit randint() eine zahl machen, die nicht größer als 48 sein kann.
http://www.cs.unm.edu/~dlchao/flake/doom/
chell
User
Beiträge: 21
Registriert: Sonntag 24. September 2006, 08:45

murph hat geschrieben:

Code: Alles auswählen

import random
anzahl_durchlauf = input("Bitte die Anzahl der Durchlaeufe eingeben: ")
counter = 0
while counter < anzahl_durchlauf:
    lotto_nummern = range(1,50)
    for i in range(6):
            zufallsindex = random.randint(0,49)
            print lotto_nummern[zufallsindex]
            lotto_nummern.pop(zufallsindex)
    print "\n"       
    counter += 1
input("Eine beliebige Taste zum Beenden betaetigen!")
erstens musst du einfach nur die lottonummernliste kurz vorher generieren,
>>> a = range(1,50)
>>> print a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]
>>> a[0]
1
>>> a[48]
49
zweitens bist du mit den indizien durcheinandergeraten.
sowohl in range() als auch mit der mit randint() produzierten zahl.
denn von dieser nun richtig produzierten liste ist der letzte listenindex schließlich 48. daher musst du auch mit randint() eine zahl machen, die nicht größer als 48 sein kann.
Habe Deine Variante probiert. Dasselbe Problem tritt aber trotzdem auf. Ich bin aber dran. Am Ende wird ein Element aus der Liste der Nummern gelöscht. Der Fehler tritt auf, wenn auf ein bereits gelöschtes Element zugegriffen wird. Ich werde also versuchen erstmal zu überprüfen, ob das Zufallselement in der Liste ist. Wenn ja, ganz normal weiter, wenn nein, ein anderen Zufallsindex generieren.
Danke,

chell
chell
User
Beiträge: 21
Registriert: Sonntag 24. September 2006, 08:45

Jetzt habe ich folgenden Code:

Code: Alles auswählen

import random
anzahl_durchlauf = input("Bitte die Anzahl der Durchlaeufe eingeben: ")
counter = 0
while counter < anzahl_durchlauf:
    lotto_nummern = range(1,50)
    for i in range(6):
            zufallsindex = random.randint(0,49)
            while zufallsindex not in lotto_nummern:
                zufallsindex = random.randint(0,49)
            print lotto_nummern[zufallsindex]
            lotto_nummern.pop(zufallsindex)
    print "\n"       
    counter += 1
input("Eine beliebige Taste zum Beenden betaetigen!")


Funktioniert leider auch nicht, selber Fehler...
Danke,

chell
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

mal so als tipp:
1) die entscheidenen stellen in der python-command-line testen.
2) außerdem die Fehlermeldung durchlesen, dann kannste sehen, wo der fehler aufgetreten ist: springe zu schritt 1
3) wenn alles nicht hilft und der sprung von 2. zu 1. erfolglos bleibt, MIT FEHLERMELDUNG in dieses Forum stellen.
http://www.cs.unm.edu/~dlchao/flake/doom/
chell
User
Beiträge: 21
Registriert: Sonntag 24. September 2006, 08:45

Ich weiß, wo der Fehler auftritt und warum. Ich habe eine Maßnahme getroffen, um ihn zu beheben, die keine Wirkung zeigt. Der Fehler tritt auf, wenn nach dem ersten Durchlauf ein Element aus der Liste der möglichen Lottonummern gelöscht wurde und der neue Zufallsindex dem alten entspricht. Die Fehlermeldung ist folgende:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Dokumente und Einstellungen\Benutzername\Desktop\lotto.py", line 10, in <module>
    print lotto_nummern[zufallsindex]
IndexError: list index out of range
Der Code ist derselbe, wie der letzte, den ich hier gepostet habe.
Danke,

chell
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

du beachtest bei deiner überprüfung eine sache nicht:
du kuckst, ob die zahl noch in der liste ist, aber beachtest nicht lie länge des indexes:
zb:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 40, 42, 43, 44, 45, 46, 47, 48, 49]
hat 46 elemente. nun kuckst du nach, ob 49 in der liste ist.
ja! 49 ist in der liste, das sagt aber noch nichts über deinen indey aus, den du benutzen willst.
daher musst du while zufallsindex not in range(len(lotto_nummern)) schreiben.
wenn man sich alle zwischenschritte ausprinten lassen würde, wäre das kein problem gewesen ;-) dann hättest du es erkannt
Zuletzt geändert von murph am Sonntag 24. September 2006, 09:55, insgesamt 1-mal geändert.
http://www.cs.unm.edu/~dlchao/flake/doom/
chell
User
Beiträge: 21
Registriert: Sonntag 24. September 2006, 08:45

Danke für die Hilfe. Einen kleinen Fehler hattest du aber auch:
range(len(lotto_nummern)). Da hat die schließende Klammer gefehlt ;-).
Danke,

chell
BlackJack

Das ganze geht übrigens in einer Zeile:

Code: Alles auswählen

In [11]: random.sample(xrange(1, 50), 6)
Out[11]: [48, 27, 20, 3, 44, 32]
chell
User
Beiträge: 21
Registriert: Sonntag 24. September 2006, 08:45

BlackJack hat geschrieben:Das ganze geht übrigens in einer Zeile:

Code: Alles auswählen

In [11]: random.sample(xrange(1, 50), 6)
Out[11]: [48, 27, 20, 3, 44, 32]
Danke, das ist in der Tat sehr kurz und effizient.
Danke,

chell
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

@murph: Indizien??? SCNR, Christian
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

So leid es mir tut, das ist aber der richtige Plural von Index
lat.: index, indices - der Zeigefinger
folglich ist der unterschied zwischen dem, was auf eine listenposition zeigt
und dem, was auf den täter zeigt, nicht so groß.
der buchindex kommt daher, dass die mönche dort mit ihrem ZEIGEfinger längsgefahren sind, um die richtige stelle zu finden (vergleiche mit erstklässler beim lesen ;-) )
das wars auch schon, mir würde bestimmt noch mehr einfallen...
http://www.cs.unm.edu/~dlchao/flake/doom/
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

murph hat geschrieben:So leid es mir tut, das ist aber der richtige Plural von Index
Eben nicht.
murph hat geschrieben:lat.: index, indices - der Zeigefinger
Schon, das stimmt. ABer wo siehst du Hier Indizien? Ich sehe hier nur Indizes.
http://www.indexetera.de/ie_anhang.html hat geschrieben:Was ist der Plural von Index?

Sowohl Indexe als auch Indizes. Indexe dürfte die angemessene Parallele zur englischen Plural-Form „Indexes“ sein, die seit Shakespeares Zeiten als die im bibliographischen Kontext korrekte Form gilt.
murph hat geschrieben:folglich ist der unterschied zwischen dem, was auf eine listenposition zeigt und dem, was auf den täter zeigt, nicht so groß.
Und noch kleiner wirds, wenn mans falsch schreibt.
murph hat geschrieben:das wars auch schon, mir würde bestimmt noch mehr einfallen...
Was bei der falschen Grundannahme auch nur belegen würde, dass Indizes richig sind und Indizien etwas anderes. :P
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

http://de.wikipedia.org/wiki/Index_(Mathematik) (um diesen Index geht es hier doch und nicht http://de.wikipedia.org/wiki/Indiz)
siehe auch www.uni-kassel.de/~diethelm/WissArb/Schreibstil.pdf, http://faql.de/numerus.html - wobei der Fall "Matrix' weiterhin beide Lösungen erlaubt ;-)
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

sry, hab da was durcheinandergebracht.
natürlich indizes... :roll:
http://www.cs.unm.edu/~dlchao/flake/doom/
Antworten