CSV, List, Dictionarie und Loops

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
DrRocket
User
Beiträge: 30
Registriert: Freitag 11. Mai 2018, 15:11

Hallo zuammen,

ich lerne seit knapp 3 Wochen Python in meiner Freizeit und habe Probleme mit einer Übungsaufgabe. Es geht um folgendes:

- csv Datei öffnen und Zeile für Zeile auslesen
- Bestimmte Elemente (key, value) jeder Zeile in einem Dictionarie ablegen
- Wenn es im dict bereits einen Eintrag mit key == "Name" gibt, dann soll der value zu diesem Eintrag um den aktuell ausgelsenen value der csv Datei erhöht werden

Hier der Code:

Code: Alles auswählen

with open("data/list_dict_beispiel.csv", "r") as file:
    splitted_list = []
    result_dict = {"": 0}
    name = 0
    count = 0

    for line in file:
        splitted_list = line.strip().split(",")
        name = splitted_list[1]
        count = int(splitted_list[5])
        for key, value in result_dict.items():
            if key == name:
                result_dict[key] = result_dict[key] + value
            else:
                result_dict[key] = value
print(result_dict)
Die erste for Schleife wird richtig durchlaufen und auch die richtigen Werte, Typen werden in den Variablen name und count abgelegt. Die zweite for Schleife scheint allerdings nicht durchzulaufen. Das dict bleibt leer. Jemand eine Idee was ich hier übersehen habe?

Der Inhalt der csv Datei sieht wie folgt aus:

5647376,Caden,2014,M,WY,2
5647377,Camden,2014,M,WY,6
5647378,Cayden,2014,M,WY,6
5647379,Christian,2014,M,WY,6
DrRocket
User
Beiträge: 30
Registriert: Freitag 11. Mai 2018, 15:11

Habe den Fehler gerade selbst gefunden. Die zweite for Schleife ist falsch. Der Code müsste so aussehen falls es wen interessiert:

Code: Alles auswählen

with open("data/list_dict_beispiel.csv", "r") as file:
    result_dict = {}
    splitted_list = []

    for line in file:
        splitted_list = line.strip().split(",")
        if splitted_list[1] == "Id":
            continue
        name = splitted_list[1]
        count = int(splitted_list[5])
        print(name + " " + str(count))
        if name in result_dict:
            result_dict[name] = result_dict[name] + count
        else:
            result_dict[name] = count
print(result_dict)
Sirius3
User
Beiträge: 17745
Registriert: Sonntag 21. Oktober 2012, 17:20

Für das Lesen von csv-Dateien gibt es das Modul csv. Das solltest Du benutzen und nicht etwas eigenes erfinden. Du weist `splitted_list` eine leere Liste zu, die Du gar nicht verwendest, die Zeile kann weg. Wenn es eine Header-Zeile (bei Dir durch "ID" gekennzeichnet), entfernt man die, bevor man in die for-Schleife geht. Strings stückelt man nicht mit + und str zusammen, sondern benutzt .format. Statt sich selbst einen Mechanismus auszudenken, wie man in einem Wörterbuch zusammenzählen kann, nimmt man defaultdict.

Code: Alles auswählen

import csv
from collections import defaultdict

with open("data/list_dict_beispiel.csv", "r") as lines:
    entries = csv.reader(lines)
    _header = next(entries)
    result_dict = defaultdict(int)
    for entry in entries:
        name = entry[1]
        count = int(entry[5])
        print("{} {}".format(name, count))
        result_dict[name] += count
print(result_dict)
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Sirius3 hat geschrieben: Mittwoch 30. Mai 2018, 07:13 Strings stückelt man nicht mit + und str zusammen, sondern benutzt .format.

Code: Alles auswählen

        print("{} {}".format(name, count))
und da du ganz frisch dabei, noch lernfähig bist und ein richtiger Pythonista werden willst,
empfehle ich dir die f-strings die es seit Python 3.6 gibt. :shock:

Code: Alles auswählen

        print(f"{name} {count}")
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten