Seite 1 von 1

Problem mit Liste

Verfasst: Sonntag 24. September 2006, 08:49
von chell
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...

Verfasst: Sonntag 24. September 2006, 09:02
von murph

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.

Verfasst: Sonntag 24. September 2006, 09:12
von chell
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.

Verfasst: Sonntag 24. September 2006, 09:16
von chell
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...

Verfasst: Sonntag 24. September 2006, 09:20
von murph
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.

Verfasst: Sonntag 24. September 2006, 09:30
von chell
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.

Verfasst: Sonntag 24. September 2006, 09:47
von murph
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

Verfasst: Sonntag 24. September 2006, 09:53
von chell
Danke für die Hilfe. Einen kleinen Fehler hattest du aber auch:
range(len(lotto_nummern)). Da hat die schließende Klammer gefehlt ;-).

Verfasst: Sonntag 24. September 2006, 10:44
von 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]

Verfasst: Sonntag 24. September 2006, 12:52
von chell
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.

Verfasst: Sonntag 24. September 2006, 13:11
von CM
@murph: Indizien??? SCNR, Christian

Verfasst: Sonntag 24. September 2006, 13:32
von murph
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...

Verfasst: Sonntag 24. September 2006, 13:51
von Leonidas
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

Verfasst: Sonntag 24. September 2006, 13:52
von CM
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 ;-)

Verfasst: Sonntag 24. September 2006, 14:20
von murph
sry, hab da was durcheinandergebracht.
natürlich indizes... :roll: