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)}]
Вернуться на верх