Wo liegt mein Fehler im Code

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Mrs_Y
User
Beiträge: 2
Registriert: Freitag 1. Januar 2021, 22:38

Hallo Zusammen,

Python stellt sich für mich als großes Fragezeichen heraus, da es meine 1. Programmiersprache und damit auch meine ersten Gehversuche sind, freue ich mich über eure Antworten :-)
Mein Ziel ist es am Ende eine Liste zu erhalten, in der die Top 10 Namen aus der CSV.Datei angezeigt werden die im Zeitraum zwischen 1985 und 2001 vergeben worden sind. Die Liste ist wie folgt aufgebaut und enthält unzählige Einträge (# ID = 0 ; Name = 1 ; Year = 2; Gender = 3 ; State = 4 ; Count = 5)
Ich habe bisher folgenden Code geschrieben und verstehe nicht, warum ich mein gewünschtes Ergebnis nicht angezeigt bekomme. Meine Erwartung war, dass mir das Programm alle Namen zwischen 1985-2001 auflistet inkl. Doppelnennung. Aber leider erhalte ich einen einzigen Namen, der nicht einmal den Kriterien entspricht?!

with open("names.csv") as Datei:

for Namensliste in Datei:
zeile = Namensliste.strip().split(",")
ID = zeile [0]
Vorname = zeile [1]
Geschlecht = zeile[3]
Staat = zeile[4]
County = zeile[5]
if zeile [2] == 'Year':
continue
Jahr = int(zeile[2])
if Jahr >= 1985 and Jahr <= 2001:
continue
print (Vorname)


# ID = 0 ; Name = 1 ; Year = 2; Gender = 3 ; State = 4 ; Count = 5

Zudem verstehe ich den Code ab Zeile 10 nicht ganz :

if zeile [2] == 'Year':
continue
Jahr = int(zeile[2])

Ich weiß, das ich mit "int" dem Programm sage, dass es bei den Strings sich um Zahlen handelt aber den Aufbau kann ich leider nicht nachvollziehen
Ich hätte den Code mit "Jahr = int (Zeile [2]) " beschrieben und wäre fortgefahren, da habe ich aber einen Syntax-Fehler erhalten.

Viele Grüße
Mrs_Y
Viele Grüße
Mrs_Y
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Mrs_Y: Also Du hast angeblich den Code geschrieben, verstehst den Code ab Zeile 10 aber nicht ganz‽

Dir wird nur ein Name ausgegeben weil Du `print()` nur ein einziges mal ausführst, unabhängig von irgendwelchen Kriterien, nach der Schleife.

Ich würde empfehlen ein Grundlagentutorial durchzuarbeiten. Es gibt eines in der Python-Dokumentation.

Weitere Anmerkungen zum Quelltext: Sinnvolle Namen sind wichtig. `Namensliste` ist keine Namensliste. `zeile` ist nicht wirklich eine Zeile. `County` ist laut der Beschreibung kein Bezirk sondern eine Anzahl.

Grunddatentypen gehören nicht in Namen.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

``continue`` sollte man vermeiden. Das ist ein unbedingter Sprung den man nicht an der Struktur des Quelltextes ablesen kann.

Statt die Kopfzeile in der Schleife besonders zu behandeln und dafür für jeden Datensatz in der Datei eine Prüfung durchzuführen von der man weiss das sie nur ein einziges mal zutrifft, und das nur beim ersten ”Datensatz”, behandelt man diesen einen Fall einfach *vor* der Schleife.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Mrs_Y
User
Beiträge: 2
Registriert: Freitag 1. Januar 2021, 22:38

__blackjack__ hat geschrieben: Samstag 2. Januar 2021, 01:22 @Mrs_Y: Also Du hast angeblich den Code geschrieben, verstehst den Code ab Zeile 10 aber nicht ganz‽ ...
Danke für die Anmerkungen :-) Den Code habe ich tatsächlich geschrieben, aber nicht ganz ohne vorher in das Skript vom Prof. zu gucken. Leider stehen da aber keine Erklärungen warum das so ist. ("Doof ist, wenn der Prof. denkt die Teilnehmer haben bereits Programmierkenntnisse, die man aber nicht hat")

Ich weiß, dass ich mit "int()" dem Programm den Hinweis gebe, das es sich bei Inhalt um eine Zahl handelt, folglich würde ich mit "Jahr = int(zeile[2])" beginnen und dann meine Eingrenzung mit den Jahreszahlen beschreiben.
Damit wäre für meine Verständnis der Teil ... überflüssig.

if zeile [2] == 'Year':
continue
Viele Grüße
Mrs_Y
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Mrs_Y: Das ist kein ”Hinweis” sondern da wird eine Zeichenkette in eine Zahl umgewandelt. Und das hat mit den zwei Zeilen davor nur bedingt etwas zu tun, denn die lösen ein ganz anderes Problem. Wenn die nicht dort wären, was würdest Du denn dann bei ``Jahr = int(zeile[2])`` erwarten wenn ``zeile[2]`` den Wert "Year" hat?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du eine csv-Datei hast, dann wäre das sinnvollste, die mit dem csv-Modul zu lesen.
Wenn die Datei einen Header hat, den man ignorieren möchte, dann macht man das vor der for-Schleife.
Die Zeile entpackt man dann am besten gleich in der for-Schleife in mehrere Variablen.
Die if-Bedingung ist ja dann auch genau das Gegenteil von dem, was Du im Text beschreibst.

Code: Alles auswählen

import csv

def main():
    with open("names.csv", encoding="utf8", newline="") as lines:
        entries = csv.reader(lines, delimiter=",")
        _header = next(entries)
        for id, vorname, jahr, geschlecht, staat, count in entries:
            if 1985 <= int(jahr) <= 2001:
                print(vorname)

if __name__ == '__main__':
    main()
Nufnus
User
Beiträge: 18
Registriert: Sonntag 29. November 2020, 21:40

Hallo,

wenn du Code postest, dann setze bitte immer "Code Tags", damit das so schön bunt wird wie bei Sirius.
Kann man sonst kaum lesen, außerdem sind die Einrückungen in Python sehr wichtig.
[#code]
Dein python code
[#/code]

(Ohne die # Zeichen)

Von continue wurde dir ja schon abgeraten, aber prinzipiell funktioniert das so:

Code: Alles auswählen

for buchstabe in "wort":
    if buchstabe == "o":
        continue
    print (buchstabe)

print("The End")

Code: Alles auswählen

Output:

w
r
t
The End
Die for schleife hat 4 Durchläufe (für jeden Buchstaben in "wort") und prüft 4mal ob es sich bei dem aktuell betrachteten Buchstaben um ein "o" handelt. Falls ja springt der Programmfluss wieder an den Kopf der Schleife und beginnt mit dem nächsten Durchlauf. Falls nein wird der Buchstabe ausgegeben.
Ganz am Ende wird dann auch auf jeden Fall noch einmal "The End" ausgegeben (daran siehst du auch die Wichtigkeit von Einrückungen. Wäre print("The End") eingerückt dann würde es sich innerhalb der for Schleife befinden und mehrmals ausgegeben werden.

Falls du mit dem continue überhaupt Schwierigkeiten hattest, aber das Gefühl hatte ich jetzt. Es gibt auch noch "break" - das sollte man glaube ich ähnlich sparsam verwenden.
Antworten