Listenmanipulation

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
haeuslermartin
User
Beiträge: 66
Registriert: Sonntag 21. April 2013, 10:12

# 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 ...
Zuletzt geändert von Anonymous am Freitag 22. Juli 2016, 13:21, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@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)
haeuslermartin
User
Beiträge: 66
Registriert: Sonntag 21. April 2013, 10:12

vielen Dank, ganz logisch, da hab ich arg auf dem Schlauch gestanden ...
haeuslermartin
User
Beiträge: 66
Registriert: Sonntag 21. April 2013, 10:12

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 ...
Zuletzt geändert von Anonymous am Samstag 23. Juli 2016, 20:47, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@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)
haeuslermartin
User
Beiträge: 66
Registriert: Sonntag 21. April 2013, 10:12

nochmal danke, ich hab mich wohl in den Gedanken verannt, für jeden Fall eine eigene Bedingung zu machen und mich dabei verzettelt ...
Antworten