Упорядоченный список событий в python

769 0

В каком виде лучше всего хранить список событий в python.
Чаще всего я видел, что хранят в виде списка словарей.
Что-нибудь типа такого:

dt = datetime(2007, 11, 26, 0, 0)
events = [
    {
        "time": dt,
        "str": "str_1",
        "int": 1
    },
    ...
]

И тогда для вставки очередного события придется или "ковыряться с индексами, или каждый раз делать сортировку.

На мой взгляд лучше события хранить в виде именованных кортежей.
Это позволит нам вставлять события с помощью реализации алгоритма бинарного поиска bisect.
Код будет выглядеть так:

from bisect import insort
from datetime import datetime, timedelta
from typing import NamedTuple

class Event(NamedTuple):
    time: datetime
    s: str
    d: int

# Список событий
events = [
    Event(dt, '1', 1), 
    Event(dt + timedelta(minutes=1, hours=5), '5', 5), 
    Event(dt + timedelta(minutes=2, hours=5), '6', 6)
]

# Добавляем событие сразу на его законное место
new_event = Event(dt + timedelta(seconds=30, minutes=1, hours=5), '4', 4)
insort(events, new_event)

Новое событие как и ожидается попадает на своё место и сортировка нам будет не нужна так как список будет всегда отсортирован.

>>> events
[Event(time=datetime.datetime(2007, 11, 26, 0, 0), s='1', d=1),
 Event(time=datetime.datetime(2007, 11, 26, 5, 1), s='5', d=5),
 Event(time=datetime.datetime(2007, 11, 26, 5, 1, 30), s='4', d=4),
 Event(time=datetime.datetime(2007, 11, 26, 5, 2), s='6', d=6)]

Комментарии

Контактные данные

 Россия, г. Москва