Как вернуть упорядоченный список мероприятий?
Встроенные методы 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'])]