Seite 1 von 1

Mehrdimensionale Liste filtern (ID und Dattum)

Verfasst: Freitag 15. Januar 2021, 09:35
von ecb77
Hallo,
ich hoffe das ich mit meinem Thema in "Allgemeine Fragen" richtig bin.
Ich habe erst vor kurzem mit Python angefangen, habe aber schon ein kleines Projekt (für die Firma) welches ich gerne umsetzen möchte.
Leider stehe ich grad vor einem logischen Problem (oder es steht einfach jemand auf der Leitung).

Über eine API frage ich den Status einer Archivierung ab. Das klappt sehr gut.
Nach dem aufarbeiten der Daten habe ich nun eine mehrdimensionale Liste.
(ID, Status, Datum/Zeit),(ID, Status, Datum/Zeit), ...
Hier ein Beispiel:
[(15, 'warning', '2021-01-14 11:32:09'), (2, 'failed', '2021-01-14 09:17:32'), (15, 'failed', '2021-01-14 09:17:43'), (2, 'succeeded', '2021-01-14 09:17:45'), (3, 'succeeded', '2021-01-14 11:32:09'), (2, 'succeeded', '2021-01-14 17:41:00'), (3, 'succeeded', '2021-01-14 17:41:01')]

Jetzt brauche ich aber für jede ID (welche vor der Abfrage unbekannt sind) nur den Status des aktuellsten Datums.
Also ungefähr so:
ID 2 = Status "succeeded" "2021-01-14 17:41:00"
ID 3 = Status "succeeded" "2021-01-14 17:41:01"
ID 15 = ...

Kann mir da jemand den Weg weisen? Sehe grad den Wald vor lauter Bäumen nicht :-)
Danke

Re: Mehrdimensionale Liste filtern (ID und Dattum)

Verfasst: Freitag 15. Januar 2021, 11:20
von einfachTobi
Das kannst du mit itertools.groupby lösen.
Gleichzeitig solltest du das Datum als String in ein datetime.datetime-Objekt umwandeln, sofern du damit weiter arbeiten willst.

Edit: Sorry, Aufgabenstellung falsch verstanden und daher meinen Beispielcode entfernt. Vielleicht habe ich später noch etwas Zeit um dir ein Beispiel zu schreiben.

Re: Mehrdimensionale Liste filtern (ID und Dattum)

Verfasst: Freitag 22. Januar 2021, 10:50
von __blackjack__
@ecb77: Erst einmal würde ich beim Aufbereiten der API-Abfrage die Zeitstempel in `datetime`-Objekte umwandeln.

Und dann kann man ein Wörterbuch aufbauen, das IDs auf Ergebnisse vom gewünschten Tag abbildet.

Code: Alles auswählen

#!/usr/bin/env python3
from collections import defaultdict, namedtuple
from datetime import date as Date, datetime as DateTime

TIMESTAMP_FORMAT = "%Y-%m-%d %H:%M:%S"

ARCHIVING_RESULTS = [
    (15, "warning", "2021-01-14 11:32:09"),
    (2, "failed", "2021-01-14 09:17:32"),
    (15, "failed", "2021-01-14 09:17:43"),
    (2, "succeeded", "2021-01-14 09:17:45"),
    (3, "succeeded", "2021-01-14 11:32:09"),
    (2, "succeeded", "2021-01-14 17:41:00"),
    (3, "succeeded", "2021-01-14 17:41:01"),
]

Result = namedtuple("Result", "id state timestamp")


def get_archiving_results():
    return [
        Result(id_, state, DateTime.strptime(timestamp_text, TIMESTAMP_FORMAT))
        for id_, state, timestamp_text in ARCHIVING_RESULTS
    ]


def get_results_for_date(archiving_results, date=None):
    if date is None:
        date = Date.today()

    id_to_results = defaultdict(list)
    for result in archiving_results:
        if result.timestamp.date() == date:
            id_to_results[result.id].append(result)

    return id_to_results


def main():
    results = get_archiving_results()
    id_to_results = get_results_for_date(results, Date(2021, 1, 14))
    for id_, results_for_id in sorted(id_to_results.items()):
        results_text = ", ".join(
            f'Status "{result.state}" "{result.timestamp:{TIMESTAMP_FORMAT}}"'
            for result in results_for_id
        )
        print(f"ID {id_} = {results_text}")


if __name__ == "__main__":
    main()