Fehler abfangen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Bykl
User
Beiträge: 103
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: 18329
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: 103
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: 18329
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: 14237
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()
“Ich bin für die Todesstrafe. Wer schreckliche Dinge getan hat, muss eine angemessene Strafe bekommen. So lernt er seine Lektion für das nächste Mal.” — Britney Spears, Interview in der französischen Zeitung Libération, 2. April 2002
Bykl
User
Beiträge: 103
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: 14237
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.
“Ich bin für die Todesstrafe. Wer schreckliche Dinge getan hat, muss eine angemessene Strafe bekommen. So lernt er seine Lektion für das nächste Mal.” — Britney Spears, Interview in der französischen Zeitung Libération, 2. April 2002
Antworten