Python - упорядочивание списка python по объекту datetime
У меня есть список объектов datetime, который добавляется в массив из моей базы данных с помощью дополнительной библиотеки Django Recurrence.
Я добавляю его следующим образом внутри цикла for:
events = Events.objects.filter(...some conditions)
timeslots = []
for event in events:
for occurence in event.recurrences.between(context['today'], context['end']):
occurence_date = datetime.combine(occurence.date(), time(0, 0))
timeslots.append({
'start_date': occurence_date + timedelta(hours=event.start_time.hour, minutes=event.start_time.minute),
'end_date': occurence_date + timedelta(hours=event.end_time.hour, minutes=event.end_time.minute),
})
Тогда он выведет его как [{'start_date': datetime.datetime(2022, 3, 7, 14, 0), 'end_date': datetime.datetime(2022, 3, 7, 15, 0)}, {'start_date': datetime.datetime(2022, 3, 8, 14, 0), ... }], что замечательно.
Побочный эффект от цикла событий заключается в том, что он добавляет другие события после всех событий, например, 1 марта, 5 марта, 10 марта, 2 марта, 4 марта и т.д. и т.п. Я хотел бы упорядочить их по дате начала, чтобы я мог вывести их в правильном порядке в моем шаблоне.
Спасибо
Если вы хотите отсортировать список словарей, вы можете использовать sorted,
но вы должны передать key, с которым вы хотите сортировать, примерно так:
sorted_timeslots = sorted(timeslots, key=lambda x: x['start_date'])
Вы можете попробовать sorted, который принимает два аргумента: объект iterable и ключ. Последний указывает, как функция должна сортировать первый аргумент (массив). Для большей наглядности я сгенерировал пример:
timeslots = [{'start_date': datetime.datetime(2022, 3, 7, 14, 0), 'end_date': datetime.datetime(2022, 3, 7, 15, 0)},
{'start_date': datetime.datetime(2022, 3, 8, 14, 0) ,'end_date': datetime.datetime(2022, 3, 5, 14, 0)},
{'start_date': datetime.datetime(2022, 3, 10, 20, 0) ,'end_date': datetime.datetime(2022, 3, 7, 13, 0)},
{'start_date': datetime.datetime(2022, 3, 3, 20, 0) ,'end_date': datetime.datetime(2022, 3, 7, 11, 0)}
]
sorted(timeslots, key=lambda x: x["start_date"])
Выход
[{'end_date': datetime.datetime(2022, 3, 7, 11, 0),
'start_date': datetime.datetime(2022, 3, 3, 20, 0)},
{'end_date': datetime.datetime(2022, 3, 7, 15, 0),
'start_date': datetime.datetime(2022, 3, 7, 14, 0)},
{'end_date': datetime.datetime(2022, 3, 5, 14, 0),
'start_date': datetime.datetime(2022, 3, 8, 14, 0)},
{'end_date': datetime.datetime(2022, 3, 7, 13, 0),
'start_date': datetime.datetime(2022, 3, 10, 20, 0)}]