@gerryontour: Anmerkungen zum Quelltext:
Warum verbindest Du zwei literale Zeichenketten mit ``+``? Da kann man doch einfach gleich nur *eine* Zeichenkette schreiben.
An den Namen musst Du arbeiten. Was soll `f` bedeuten? `file`? Gibt es ja auch, aber das ist dann gar keine Datei, sondern eine Liste mit Zeichenketten. `i` ist ein ganz schlechter Name für eine Zeichenkette. Leser erwarten unter `i`, `j`, und `k` ganze Zahlen die als Index verwendet werden können. `line` wäre beispielsweise ein passender Name für eine Zeile.
Der `readlines()`-Aufruf ist Überflüssig. Dateiobjekte sind iterierbar und liefert die Zeilen aus der Datei.
Zeilenendezeichen entfernt man am Ende und sicht nicht in der gesamten Zeile danach. Also `rstrip()` statt `replace()`. Wobei das nicht wirklich notwendig ist, denn `int()` stört sich nicht an ”whitespace” vor und nach der Zahldarstellung.
Nach dem Einlesen sollte man bereits eine Liste mit Zahlen haben und nicht eine Liste mit Zeichenketten wo *jedesmal* zum addieren die Zeichenketten erneut in Zahlen umgewandelt werden.
Im ``with``-Block braucht nur der Code stehen, der die Daten einliest. Nachdem das passiert ist, braucht man die Datei ja nicht mehr.
`key` und `value` ist hier auch unpassend weil `key` gar kein Schlüssel ist.
`twfive` ist auch kein guter Name. Er ist kryptisch abgekürzt und sagt überhaupt aus was der Wert bedeutet, nur das es irgendwas mit „twenty five“ ist, wenn man den Namen mit der literalen Zahl in der Zeile in Verbindung bringen kann.
Und auch `final` ist nicht wirklich verständlich.
`i` ist wie gesagt ein Name für Indexwerte, also auch wieder schlecht, weil es zwar ganze Zahlen sind, aber keine Indexwerte. Bei `e` und `ap` kann ich nicht mal ansatzweise erraten was die bedeuten sollen. Man muss auch nicht jeden Zwischenwert an einen Namen binden.
``continue`` sollte man meiden. Das ist hier auch überhaupt nicht nötit, denn nach dem ``if``/``else`` wird ja ganz regulär ein neuer Schleifendurchlauf begonnen. Man kann also einfach die Bedingung beim ``if`` umkehren und den Code aus dem ``else``-Zweig in den ``if``-Zweig verschieben.
Zwischenstand mit besseren Namen, aber Code der immer noch das gleiche macht wie Deiner, also noch fehlerhaft ist:
Code: Alles auswählen
#!/usr/bin/env python3
def main():
print("------------\n\n")
with open("pe.txt", "r") as file:
numbers = [int(line) for line in file]
for i, number in enumerate(numbers):
previous_numbers = numbers[i : i + 25]
sums = []
for number_a in previous_numbers:
for number_b in previous_numbers:
sums.append(number_a + number_b)
if number not in sums:
print(number)
break
if __name__ == "__main__":
main()
Die von Dir genannte Zeile macht in der Tat nicht das richtige. Mit den richtigen Namen fällt vielleicht sogar auf was der Fehler in der Zeile ist.
Aber auch die Schleife welche die Summen berechnet ist fehlerhaft. Einer der Beispielfälle für (un)gültige Zahlen aus der Aufgabenstellung würde damit nicht funktionieren.
Darum als Tipp diese Beispielfälle tatsächlich als Tests zu programmieren. Da gibt es bekannte Eingabedaten und dazu gehörende Ergebnisse. Wenn Dein Code die nicht reproduzieren kann, dann ist es *sehr* wahrscheinlich, dass es auch bei den Eingabedaten für die Aufgabe nicht richtig funktionieren wird.