Seite 1 von 1

Fehler abfangen

Verfasst: Montag 21. November 2022, 12:40
von Bykl
Hallo, ich hab das öfters, Index out of range:

Ich kann es mit range abfangen. Aber ich möchte was Eleganteres.
wenn ich sowas schreibe:

Code: Alles auswählen

if BCode[t]==0 and (BCode[t+1]==1 or if not exist (BCode[t+1]):

kommt invalid Syntax.

Wie kann ich das korrekt schreiben, den Gedanke?

Code: Alles auswählen

BCode=[0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0] 
z=0
nr=0
starts=[]
for t,i in enumerate(BCode):
    nr+=1
    print(nr,t,BCode[t],BCode[(t+1)],z)
    if BCode[t]==0 and (BCode[t+1]==1 or if not exist (BCode[t+1]):
        z+=1
        starts.append(i)
    else:
        pass
print("Starts",len(starts),starts)

Re: Fehler abfangen

Verfasst: Montag 21. November 2022, 13:26
von Sirius3
`nr` ist mit `t` redundant. `i` und `BCode[t]` sind auch identisch.
Die `starts-Liste ist ziemlich witzlos, weil sie nur 0en enthält.
Ein leerer ´else: pass`-Block kann man einfach weglassen.

Statt mit Indizes rumzuwerklen nimmt man statt dessen passende Iteratoren:

Code: Alles auswählen

from more_itertools import pairwise
from itertools import chain

bcode = [0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0] 
z = 0
for a, b in pairwise(chain(bcode, [1])):
    if a == 0 and b == 1:
        z += 1
starts = [0] * z
print("Starts", len(starts), starts)
oder kurz:

Code: Alles auswählen

z = sum(a == 0 and b == 1 for a, b in pairwise(chain(bcode, [1])))

Re: Fehler abfangen

Verfasst: Montag 21. November 2022, 13:40
von Bykl
Au, ein ZwischenDanke von mir, muss ich erst auswerten...

Dein Code, Sirius, sieht sehr elegant aus, und gefällt mir besser als mein eigener, aber er tut noch nicht was ich will:
BCode: 15 [0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0]
und das soll rauskommen:
Startsanalyse 5 [1, 4, 7, 10, 12]
Start meint den Index der ersten Eins einer Folge von Einsen. Fünf Folgen sind drin.

Re: Fehler abfangen

Verfasst: Montag 21. November 2022, 14:18
von Sirius3
Ich habe nur Deine Codeidee in funktionierenden Python-Code umgeschrieben. Warum brauchst Du denn die Indizes in einer Liste? Was soll damit passieren? Man versucht eigentlich, Indizes zu vermeiden.

Re: Fehler abfangen

Verfasst: Montag 21. November 2022, 14:20
von __blackjack__
Eine Möglichkeit wäre mit `more_itertools.locate()` nach übergängen von 0 nach 1 zu suchen:

Code: Alles auswählen

#!/usr/bin/env python3
from more_itertools import locate, prepend


def main():
    b_code = [0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0]
    start_indizes = list(
        locate(prepend(0, b_code), lambda *pair: pair == (0, 1), 2)
    )
    assert start_indizes == [1, 4, 7, 10, 12]


if __name__ == "__main__":
    main()

Re: Fehler abfangen

Verfasst: Montag 21. November 2022, 14:26
von Bykl
Sirius3 hat geschrieben: Montag 21. November 2022, 14:18 Man versucht eigentlich, Indizes zu vermeiden.
Hallo Sirius, sagst Du das wegen der Geschwindigkeit?

Re: Fehler abfangen

Verfasst: Montag 21. November 2022, 16:38
von __blackjack__
@Bykl: Das hat nichts mit Geschwindigkeit zu tun. Indizes sind ”magische” Zahlen die in den meisten Fällen einfach nur eine unnötige Indirektion sind und damit den Code schwerer verständlich und fehleranfälliger machen.