@JuliCat: Fangen wir mal am Anfang an, dem Einlesen. Du öffnest die selbe Datei zweimal und hast dann eine Schleife über die Zeilen des einen Dateiobjekts um mit der aktuellen Zeile *nichts* zu machen, und die aber in der Schleife per `readline()` vom anderen Dateiobjekt zu lesen. Wie kommt man denn auf so eine Idee?
Zumal die Datei die an `f1` gebunden wird, nicht geschlossen wird. Und "r+" ist bei Textdateien eigentlich nie ein sinnvoller Modus, weil man da nur in ganz wenigen Ausnahmefällen sinnvoll etwas mit anfangen kann. Die öffnet man mit "r", "w", oder "a" und zieht dann die eine Richtung die da jeweils drin steckt, also lesen *oder* schreiben, durch.
Bei Textdateien sollte man immer explizit beim öffnen die Kodierung angeben.
`f` ist wie die meisten einbuchstabigen Namen kein guter Name. Zu `file` sollte es da schon noch reichen. `f1` kombiniert das dann auch noch mit einer nichtssagenden Nummer. Wenn Du für `f` und `f1` aussagekräftige Namen gesucht hättest, wäre Dir vielleicht an der Stelle schon aufgefallen das da was am Code nicht stimmt, denn mir fällt jetzt nicht ein wie man die sinnvoll benennen sollte. Was ja daran liegt, dass es im Grunde der gleiche Wert ist, mit dem im Code dann das effektiv das gleiche gemacht wird, nur parallel, auf etwas unterschiedlichem Weg, und das Ergebnis von einem der beiden Wege wird dann einfach konsequent ignoriert.
`str` ist zum einen eine kryptische Abkürzung → Nicht machen. Und zum anderen der Name des eingebauten Zeichenkettentyps. Den sollte man nicht an etwas anderes binden.
`Liste` wird an eine Zeichenkette gebunden. Das ist verwirrend. Und `Liste` ist auch viel zu generisch. Und dann wird in der nächsten Zeile `str` an den gleichen Wert gebunden, das hätte man sich also sparen können und gleich an `str` binden können beziehungsweise einen besseren Namen.
`Liste2` ist ein schlechter Name weil der so gar nichts über die Bedeutung des Inhalts aussagt und auch noch eine sinnlose Nummer enthält.
Aus einer Liste am Ende das erste Element mit `pop()` entfernen ist etwas was man beim erstellen der Liste schon hätte richtig machen können, in dem man das ungewollte Element da gar nicht erst rein steckt.
Und das umwandeln in ganze Zahlen hätte man auch gleich beim Einlesen machen können. Eine Liste weniger, ein Name weniger über den man sich Gedanken machen muss.
Kommentare stehen üblicherweise *über* der Zeile oder dem Block den man da kommentiert. Und sie sollten nicht beschreiben was der Code macht, solange das offensichtlich. Das steht da bereits als Code. Offensichtlich ist in der Regel was in der Dokumentation der Programmiersprache und den verwendeten Bibliotheken steht.
`koListe` ist wieder schlecht als Name weil `ko` eine kryptische Abkürzung ist. Wie wär's mit `sonnenfleckenanzahlen`. Das sagt ziemlich deutlich was die Werte da bedeuten. Und deutsch ist keine so praktische Sprache für aussagekräftige Namen. Das wird schnell sperrig.
Übrigens klein geschrieben weil: Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).
Randbemerkung: Ob das mit dem Ausschneiden von einer festen Position einer Zeile aus einer CSV-Datei so eine gute Idee ist, wage ich zu bezweifeln. Das sieht so allgemein nicht robust gegen Änderungen aus.
`listSum` und `listSum1` — da wäre wieder das Thema schlechte Namen und auch noch Nummern.
Das ganze scheint mir auch zu kompliziert, zu nah am Aufagbentext zu sein. Statt die 100 vorhergenden, die 100 nachfolgenden, und den aktuellen Wert zu addieren, kann man doch einfach die ja aufeinanderfolgenden 201 Werte in einem Durchgang addieren.
Das Deine Zahlen immer grösser und grösser werden ist ja auch irgendwie offensichtlich weil in der Schleife die einzige Operation die auf `listSum` und `listSum1` passiert immer nur aufaddieren ist. Das ist nicht wirklich sinnvoll.
Die magischen Zahlen 103 und 7935 sollten nicht fest im Quelltext stehen. Die lassen sich aus den anderen vorhanden Daten berechnen, beziehungsweise sollte die 103 gar nicht nötig sein, denn der Index fängt immer bei 0 an. An Index 0 steht die erste Anzahl an Sonnenflecken. Wenn da etwas anderes steht, hat das nix in der Liste zu suchen.
Letztlich ist das ja ein gleitendes Mittel über ein Fenster. Das programmiert man eher nicht zu Fuss selbst, da gibt es Bibliotheken für. Numpy, Pandas, oder wenn man sich diese Abhängigkeiten nicht einfangen will das (externe) `more_itertools`-Modul für das Fenster, und das `statistics`-Modul aus der Standardbibliothek. Wenn man sich selbst `more_itertools` nicht rein holen will, würde ich das trotzdem anschauen wie die das mit dem Fenster gelöst haben und das so oder so ähnlich nachprogrammieren. Ich vermute mal da würde dann was mit einer `collections.deque` heraus kommen.
An Code vielleich für den Einstieg mal das einlesen in eine Liste mit Zahlen in drei Zeilen und sinnvollen Namen:
Code: Alles auswählen
with open("sunspot_2000.csv", "r", encoding="utf-8") as file:
next(file) # Erste Zeile übespringen.
sonnenfleckenanzahlen = [int(line[21:24]) for line in file]
Alles danach würde ich komplett anders/einfacher schreiben. Halt je nach dem welche Bibliotheken man dafür verwenden möchte.