2016-03-23 1 views
0

Ich habe Ereignisse, die zu bestimmten Terminen aufgetreten sind zB:Struktur zu speichern und aktuelle Informationen zwischen zwei bestimmten Terminen abrufen

[{'date_event': datetime.date(2001, 1, 1), 'event_name': 'event_1'}, 
{'date_event': datetime.date(2001, 10, 1), 'event_name': 'event_2'}] 

ich für eine Datenstruktur in Python suche diese Informationen so zu speichern, dass Ich kann Ereignisse, die zwischen bestimmten Daten auftreten, einfach abrufen. Im Wesentlichen möchte ich eine Datenstruktur abfragen und Ereignisse zwischen zwei Daten zurückgeben können. Beispiel:

def return_events_between_dates(start_date, end_date): 
    ... 
    return(list_of_events) 

Gibt es in Python eine eingebaute Struktur, die dies leicht erlaubt? Ich möchte das Rad nicht neu erfinden, wenn es schon etwas gibt, das für diese Art von Abfrage optimiert ist. Wenn nicht, wäre Listenverständnis der beste Ansatz?

+0

Von wo Sie Daten abrufen möchten, müssen Sie Datum Vergleich erlauben, wie wenn Sie 'DJango' Datum Feld verwenden, dann wird es Datum Vergleich – Nilesh

+0

@DanGetz - danke - yeh, das war, was ich meinte - und Danke für die Antwort - das war genau die Art von Ding, auf die ich gehofft hatte. – kyrenia

Antwort

1

Nein, Es gibt keine einfache integrierte Struktur, die dies in optimierter Weise tun würde.

Allerdings bietet das Standardbibliotheksmodul bisect Funktionen zum Arbeiten mit sortierten Listen in einer optimierteren Weise als Listenergänzungen. Sie können dies verwenden, um Ihre Aufgabe zu erfüllen; Es braucht nur ein wenig Arbeit und Sorgfalt.

Leider nehmen sie keine Schlüsselfunktion als Argument, wie list.sort() tut. Um also die Funktionen bisect zu verwenden, müssen Sie Ihre Ereignisobjekte in vergleichbare Objekte vorverarbeiten und in erster Linie anhand ihrer Daten vergleichen.

preprocessed_events = [(e['date_event'], e['event_name']) for e in events] 
preprocessed_events.sort() 

Jetzt können Sie bisect_left() und bisect_right() verwenden, um die Indizes Ihrer sortierten Liste zu bekommen, wo die Ereignisse, die Sie beginnen wollen und Ende (vorausgesetzt, Ihre Endpunkte beide eingeschlossen sind): Tupeln kann für diese schön

index_first = bisect.bisect_left(preprocessed_events, (start_date,)) 
index_last = bisect.bisect_right(preprocessed_events, (end_date,)) 

Beachten Sie, dass Sie start_date und end_date in Tupel umwandeln müssen, um mit den Tupeln in der sortierten Liste vergleichbar zu sein.

die Start- und End-Indizes Zu wissen, können Sie eine Liste aller Ereignisse mit einer Scheibe der sortierten Liste zu bekommen, und wenn nötig, sie in sein zurückzuverwandeln welcher Form auch immer wollen, um sie in zurückzukehren.

Don Vergessen Sie nicht, Ihre Slice-Indizes und Ihre Optionen bisect_left() und bisect_right() zu überprüfen, um sicherzustellen, dass Sie die Endpunkte einschließen/ausschließen, die Sie einschließen/ausschließen möchten. Vor allem, wenn Sie mehrere Ereignisse am selben Tag wie Ihre start_date oder end_date haben.

Verwandte Themen