Fehler abfangen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Bykl
User
Beiträge: 93
Registriert: Donnerstag 5. Oktober 2017, 17:57

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)
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

`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])))
Bykl
User
Beiträge: 93
Registriert: Donnerstag 5. Oktober 2017, 17:57

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.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Bykl
User
Beiträge: 93
Registriert: Donnerstag 5. Oktober 2017, 17:57

Sirius3 hat geschrieben: Montag 21. November 2022, 14:18 Man versucht eigentlich, Indizes zu vermeiden.
Hallo Sirius, sagst Du das wegen der Geschwindigkeit?
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten