Seite 1 von 1

Listen durchsuchen

Verfasst: Dienstag 12. Januar 2021, 14:31
von Schnabeltasche
Hallo zusammen,
ich versuche mir gerade selbst und durch diverse Bücher, Kurse und dergleichen die Sprache beizubringen.

Ich stehe vor folgendem Problem und suche wohl die bestmöglichste Lösung.

Ich lese eine CSV-Datei ein, durchsuche jede Zeile nach einem bestimmten Wert und füge diese entweder der Liste A oder B zu (je nach Wert)
Dieser Wert ist entweder S oder I und soll z.B. nach einer Inventur die Soll-, bzw. Istbestände anzeigen.
Diese CSV hat also jeweils zwei Zeilen mit dem gleichen Suchfaktor (so nenne ich das jetzt mal), allerdings mit verschiedenen Werten in den folgenden Spalten.

Als Beispiel:
Spalte A Spalte B Spalte C Spalte D
159999 S Datum 150 Stück
174004 S Datum 22 Stück
169500 S Datum 222 Stück
159999 I Datum 144 Stück
und soweiter.

Bisher habe ich die Werte dann einer Soll-, und Ist-Liste zugeordnet (macht das Sinn?)

Ich möchte eigentlich, dass das als eine Art Dictionary angelegt wird.
Mir wäre es aber auch ausreichend, dass ich dies einfach nur hintereinander stehen habe.
Ziel ist, dass ich zum Beispiel oben die 159999 die Werte im S und I zuordne und wenn noch kein I vorhanden ist einfach eine 0 oder ähnliches.

Ist dies möglich oder gibt es andere Ansätze?
Im Grunde möchte ich den "Grundstein" legen, damit ich hieraus ein Objekt erstelle.

Ich danke euch schonmal vielmals für eure Hilfe und hoffe, dass ich den richtigen Anstoß bekomme. :oops:

LG

Re: Listen durchsuchen

Verfasst: Dienstag 12. Januar 2021, 15:18
von Sirius3
Du hast ja schon die richtigen Stichworte geliefert: Dur brauchst ein Dictionary, wo Spalte A der Schlüssel ist, und der Wert halt irgendwas, was Du brauchst.

Re: Listen durchsuchen

Verfasst: Dienstag 12. Januar 2021, 16:51
von Schnabeltasche
Hallo Sirius3,

aber wie bringe ich dem Dictionary bei, dass er den zweiten Wert hinzufügt, bzw. wenn kein zweiter Wert vorhanden, diesen mit entsprechenden Nullen auffüllt?
Ich habe das mit einer if-Schleife probiert, allerdings erweitert er das Dictionary nur, wenn der zweite Wert vorhanden ist.
Wenn ich jetzt eine else hinzufüge, fügt dieser genau das Gegenteil aus.

Anbei mal mein versuchter Code:

Code: Alles auswählen

sollreferenzen = []
istreferenzen = []
sortiert = {}

dateiname = 'C:\\Users\\st\\Desktop\\Protokoll123.csv'
suche = 12345

import csv
with open(dateiname, newline='') as protokollcsv:
    protokoll = csv.reader(protokollcsv, delimiter=';')

    for zeile in protokoll:

        if zeile[1] == "S":
            sollreferenzen.append(zeile)
        else:
            istreferenzen.append(zeile)

for sollzeile in sollreferenzen:
    for istzeile in istreferenzen:
        if sollzeile[0] in istzeile:
            sortiert[(sollzeile[0])] = sollzeile + istzeile
        else:
            sortiert[(sollzeile[0])] = sollzeile + [0, 0, 0]


print(sortiert[str(suche)])

Ich bekomme dann allerdings folgende Ausgabe, obwohl ein zweiter Wert vorhanden ist:

Code: Alles auswählen

['12345', 'S', '10.02.2020', '150', 0, 0, 0]
Es sollte aber wie folgt aussehen: :-(

Code: Alles auswählen

['12345', 'S', '10.02.2020', '150', 'I', '15.02.2020', '144']

Re: Listen durchsuchen

Verfasst: Dienstag 12. Januar 2021, 19:10
von __blackjack__
@Schnabeltasche: Die Schleife über die Fehler eines Datensatzes ist Unsinn.

Ich vermute ja eher Du brauchst ein Wörterbuch das Spalte A auf Objekte abbildet die jeweils eine Liste für "S" und "I" haben, und da werden dann paare von Spalte C und D Werten drin gespeichert. Also beispielsweise so:

Code: Alles auswählen

{
    159999: {"S": [("Datum", "150 Stück")], "I": [(Datum, "144 Stück")]},
    174004: {"S": [("Datum", "22 Stück")], "I": []},
    169500: {"S": [("Datum", "222 Stück")], "I": []},
}
Falls die Spalten A und B zusammen Eindeutig sind, müssen das keine Listen sein, sondern man kann direkt die Tupel oder `None` als Werte für "S" und "I" speichern. Statt dem inneren Wörterbuch wäre eine Datenklasse für's bessere Verständnis mit ordentlichen Namen statt "S" und "I" sicher auch nicht schlecht.

Für das äussere Wörterbuch böte sich hier `collections.defaultdict` an um den Code zu vereinfachen.