Как вернуть упорядоченный список мероприятий?

Встроенные методы calendarAPI возвращают словарь с неупорядоченными ивентами.

class GoogleCalendar(object):

    def __init__(self):
        credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
        self.service = googleapiclient.discovery.build('calendar', 'v3', credentials=credentials)

    def get_events_list(self):
        # 2021-01-04T12:30:00+03:00
        now = datetime.datetime.utcnow().isoformat() + 'Z'
        day_end = datetime.datetime.now().date()
        time_end = str(day_end) + 'T23:59:59' + '+03:00'
        print('time end: ' + str(time_end))
        print("now time: " + str(now))
        print('Getting the upcoming 10 events')
        events_result = self.service.events().list(calendarId=calendarId,
                                                   timeMin=now,
                                                   timeMax = time_end,
                                                   singleEvents=True).execute()
        events = events_result.get('items', [])
        counter = 0
        event_dict = {}
        if not events:
            print('No upcoming events found.')
            return 'Нет предстоящих мероприятий'
        for event in events:
            counter                    += 1
            summary                     = event['summary']
            date_Time_start             = event['start'].get('dateTime', event['start'].get('dateTime'))
            date_Time_end               = event['end'].get('dateTime', event['start'].get('dateTime'))
            event_dict[str(counter)]    = [summary, date_Time_start, date_Time_end]
        for key in event_dict:
            print(key, '->', event_dict[key])
        return event_dict


calendar = GoogleCalendar()
events = calendar.get_events_list()

При минимальной перетасовке мероприятий код возвращает мероприятий в случайном порядке.

Собственно - вот вот вывод в консоль :

key -> value
  1 -> ['Вечерний: Донсков', None, None]
  2 -> ['Утренний: Русый', None, None]
  3 -> ['Ивент 2', '2021-01-06T19:30:00+03:00', '2021-01-06T20:30:00+03:00']
  4 -> ['Ивент 1', '2021-01-06T18:00:00+03:00', '2021-01-06T19:00:00+03:00']
  5 -> ['Ивент 3', '2021-01-06T21:15:00+03:00', '2021-01-06T22:15:00+03:00']

Подскажите, как я могу вернуть упорядоченный словарь или отсортировать его по времени?


Ответы (1 шт):

Автор решения: Jack_oS

Использовать sorted(), разве, не вариант? Если словарь событий приходит в виде

event_dict = {
    '1': ['Вечерний: Донсков', None, None],
    '2': ['Утренний: Русый', None, None],
    '3': ['Ивент 2', '2021-01-06T19:30:00+03:00', '2021-01-06T20:30:00+03:00'],
    '4': ['Ивент 1', '2021-01-06T18:00:00+03:00', '2021-01-06T19:00:00+03:00'],
    '5': ['Ивент 3', '2021-01-06T21:15:00+03:00', '2021-01-06T22:15:00+03:00']
}

то:

sorted(event_dict.items(), key=lambda e: e[1][1], reverse=False)

вернет список кортежей, отсортированных по убыванию времени начала:

>>> sorted(event_dict.items(), key=lambda e: e[1][1] if e[1][1] else '', reverse=True)
[('5', ['Ивент 3', '2021-01-06T21:15:00+03:00', '2021-01-06T22:15:00+03:00']), ('3', ['Ивент 2', '2021-01-06T19:30:00+03:00', '2021-01-06T20:30:00+03:00']), ('4', ['Ивент 1', '2021-01-06T18:00:00+03:00', '2021-01-06T19:00:00+03:00']), ('1', ['Вечерний: Донсков', None, None]), ('2', ['Утренний: Русый', None, None])]

а так:

sorted(event_dict.items(), key=lambda e: e[1][2] if e[1][2] else '', reverse=False)

по возрастанию даты окончания:

>>>sorted(event_dict.items(), key=lambda e: e[1][2] if e[1][2] else '', reverse=False)
[('1', ['Вечерний: Донсков', None, None]), ('2', ['Утренний: Русый', None, None]), ('4', ['Ивент 1', '2021-01-06T18:00:00+03:00', '2021-01-06T19:00:00+03:00']), ('3', ['Ивент 2', '2021-01-06T19:30:00+03:00', '2021-01-06T20:30:00+03:00']), ('5', ['Ивент 3', '2021-01-06T21:15:00+03:00', '2021-01-06T22:15:00+03:00'])]
→ Ссылка