Seite 1 von 1

Listenmanipulation

Verfasst: Freitag 22. Juli 2016, 09:54
von haeuslermartin
# hab mal wieder ein kleines Listenproblem, wäre dankbar für einen Tip, (bin kein Schüler oder Student, sondern Rentner, der sich hobbymäßig befasst..)

# Wie weit sind die ersten beiden Zahlen (oder 2 andere, aufeinanderfolgende) in (alle) in der Liste (kesselzahlen) voneinander entfernt?
# folgender code gibt einwandfrei Antwort, funktioniert!

Code: Alles auswählen

kesselzahlen=[10,5,24,16,33,1,20,14,31,9,22,18,29,7,28,12,35,3,26,0,32,15,19,4,21,2,25,17,34,6,27,13,36,11,30,8,23]

alle=[4,33, 36, 3, 30, 17, 30, 13, 26, 6, 27, 13, 33, 0, 32, 31, 14, 20,34]

print("index 0 = ",kesselzahlen.index(alle[0]))  # stimmt, die 4 kommt in kesselzahlen an 23.Stelle !
print("index 1 = ",kesselzahlen.index(alle[1]))  # stimmt, die 33 hat in kesselzahlen den index 4 !
print()

wurfweiten=[]
if (kesselzahlen.index(alle[0])) > (kesselzahlen.index(alle[1])):
    ww=((kesselzahlen.index(alle[0])) - (kesselzahlen.index(alle[1]))-1)
    print("Wurfweite= ", ww )   # stimmt!! (die kesselzahlen werden im Uhrzeigersinn durchlaufen) 
elif (kesselzahlen.index(alle[0])) == (kesselzahlen.index(alle[1])):
    ww = 0
    print("Wurfweite= ",ww)
else:  # kesselzahlen.index(alle[0]) ist kleiner als kesselzahlen.index(alle[1])
    ww = ((kesselzahlen.index(alle[1])) - (kesselzahlen.index(alle[0])))
    print("Wurfweite= ",ww)
#####################################################################

#2. code, funktioniert nicht

#was mit den ersten beiden Zahlen von (alle) funktioniert hat, müsste doch auch
#fortlaufend mit allen weiteren Paarungen gehen 4,33 / 33,36 / 36,3 usw.

Code: Alles auswählen

kesselzahlen=[10,5,24,16,33,1,20,14,31,9,22,18,29,7,28,12,35,3,26,0,32,15,19,4,21,2,25,17,34,6,27,13,36,11,30,8,23]

alle=[4,33, 36, 3, 30, 17, 30, 13, 26, 6, 27, 13, 33, 0, 32, 31, 14, 20,34]

wurfweiten=[]

# Versuch mit zip gibt wertepaare +1, ([1:]), könnte doch alle Paarungen von (alle) durchlaufen ?

for i, j in zip(alle, alle[1:]):
    if (kesselzahlen.index(alle[i])) > (kesselzahlen.index(alle[j])):       #IndexError: list index out of range !!!!!!!!!!!!!!!!!!!!!!
        ww =((kesselzahlen.index(alle[i])) - (kesselzahlen.index(alle[j]))-1)
        print("Wurfweite= ", ww)
        wurfweiten.append(ww)
    elif (kesselzahlen.index(alle[i])) == (kesselzahlen.index(alle[j])):
        ww = 0
        print("Wurfweite= ",ww)
        wurfweiten.append(ww)
    else:
        ww = ((kesselzahlen.index(alle[j]))-(kesselzahlen.index(alle[i])))
        print("Wurfweite= ",ww)
        wurfweiten.append(ww)

print("alle Wurfweiten : ",wurfweiten)
# im ersten code nimmt python die ersten beiden Zahlen von (alle) und schaut nach, an welcher Stelle sie in
# (kesselzahlen) stehen. warum macht die schlange das nicht auch fortlaufend? ich versteh die Fehlermeldung IndexError: list index out of range # # nicht
# welcher index ist ausserhalb welcher liste? da hab ich einfach Tomaten auf den Augen ...

Re: Listenmanipulation

Verfasst: Freitag 22. Juli 2016, 10:31
von Sirius3
@haeuslermartin: Dein Problem ist, dass i und j schon die Zahlen aus alle und nicht den Index enthalten:

Code: Alles auswählen

kesselzahlen = [10,5,24,16,33,1,20,14,31,9,22,18,29,7,28,12,35,3,26,0,32,15,19,4,21,2,25,17,34,6,27,13,36,11,30,8,23]

alle = [4, 33, 36, 3, 30, 17, 30, 13, 26, 6, 27, 13, 33, 0, 32, 31, 14, 20, 34]

wurfweiten = []
for i, j in zip(alle, alle[1:]):
    wurfweite = kesselzahlen.index(i) - kesselzahlen.index(j)
    if wurfweite > 0:
        wurfweite -= 1
    else:
        wurfweite *= -1
    print("Wurfweite= ", wurfweite)
    wurfweiten.append(wurfweite)
print("alle Wurfweiten : ", wurfweiten)

Re: Listenmanipulation

Verfasst: Freitag 22. Juli 2016, 13:54
von haeuslermartin
vielen Dank, ganz logisch, da hab ich arg auf dem Schlauch gestanden ...

Re: Listenmanipulation

Verfasst: Samstag 23. Juli 2016, 09:06
von haeuslermartin
hallo Sirius,
nicht schlimm, aber die Ergebnisse werden jetzt falsch, weil Du die Bedingung (if i > j geändert hast
ein Beispiel:

Code: Alles auswählen

kesselzahlen = [10,5,24,16,33,1,20,14,31,9,22,18,29,7,28,12,35,3,26,0,32,15,19,4,21,2,25,17,34,6,27,13,36,11,30,8,23]

alle = [4, 20, 32, 34, 5, 28, 24]
#for i in range(30):
    #alle.append(random.randint(0,36))

print(alle)
print()
wurfweiten = []
for i, j in zip(alle, alle[1:]):
    wurfweite = kesselzahlen.index(i) - kesselzahlen.index(j)
    if wurfweite > 0:
        wurfweite -= 1
    else:
        wurfweite *= -1
    print("Wurfweite= ", wurfweite)
    wurfweiten.append(wurfweite)
print("alle Wurfweiten : ", wurfweiten)
print()
wwsumme = 0
for i in wurfweiten:
    wwsumme +=i

print(wwsumme)
print()
print(wwsumme/len(wurfweiten))
das Ergebnis: alle Wurfweiten : [16, 14, 8, 26, 13, 11]

muß aber lauten: [20, 14, 8,10,13,25]
z. B. bei der ersten Paarung ist der index von i in (kesselzahlen) höher als der von j , also muß nach rachts durchgezählt werden und dann von links wieder begonnen bis j erscheint

der Hintergrund: beim Roulette gibts 37 Fächer und bei Gleichverteilung sollte sich eine durchschnittliche Wurfweite von etwa 18 ergeben
ich hab das gestern noch mit random zahlen laufen lassen zu je 100 000, da kam immer etwa 12 heraus, schön wärs ja, aber das konnte nur ein Fehler sein
um die Würfe zu vergleichen muß die Kugel immer in die gleiche Richtung laufen ...

Re: Listenmanipulation

Verfasst: Samstag 23. Juli 2016, 15:09
von Sirius3
@haeuslermartin: ich habe an Deinen Bedingungen nichts geändert, ich habe sie nur so umgeschrieben, dass ziemlich leicht klar wird, ob die Rechnung stimmt oder nicht. Und offensichtlich stimmt diese nicht.

Code: Alles auswählen

wurfweiten = []
for i, j in zip(alle, alle[1:]):
    wurfweite = (kesselzahlen.index(j) - kesselzahlen.index(i)) % len(kesselzahlen)
    wurfweiten.append(wurfweite)
    print("Wurfweite= ", wurfweite)
print("alle Wurfweiten : ", wurfweiten)

Re: Listenmanipulation

Verfasst: Sonntag 24. Juli 2016, 08:35
von haeuslermartin
nochmal danke, ich hab mich wohl in den Gedanken verannt, für jeden Fall eine eigene Bedingung zu machen und mich dabei verzettelt ...