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: 17766
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: 17766
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: 13131
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()
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
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: 13131
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.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Antworten