С учетом имеющейся информации, попробуйте, как вариант, следующее:
Вложенный список, который мы получаем в самом начале (тестовый пример)
>>> events_data = [
['place1', 'address1', 'time1', 'event1'], ['place1', 'address1', 'time1', 'event2'],
['place2', 'address2', 'time1', 'event1'], ['place2', 'address2', 'time2', 'event1'],
['place2', 'address2', 'time2', 'event2'], ['place2', 'address2', 'time2', 'event3'],
['place3', 'address3', 'time1', 'event1'], ['place3', 'address3', 'time2', 'event1'],
['place3', 'address3', 'time2', 'event2'], ['place3', 'address3', 'time2', 'event3']
]
# Словарь для сортировки данных
>>> from collections import defaultdict
>>> events_dict = defaultdict(dict)
>>> for data in events_data:
*place, time, event = data
if time in events_dict[tuple(place)]:
events_dict[tuple(place)][time].append(event)
else:
events_dict[tuple(place)][time] = [event]
# Имеем
>>> pprint.pprint(dict(events_dict))
{('place1', 'address1'): {'time1': ['event1', 'event2']},
('place2', 'address2'): {'time1': ['event1'],
'time2': ['event1', 'event2', 'event3']},
('place3', 'address3'): {'time1': ['event1'],
'time2': ['event1', 'event2', 'event3']}}
# Выводим на печать
>>> for place in events_dict:
print('\nPlace: {}\nAddress: {}'.format(*place))
for time, events_in_time in events_dict[place].items():
print('Time: ', time)
print(('Event: {}\n' * len(events_in_time)).format(*events_in_time), end='')
Результат вывода
Place: place1
Address: address1
Time: time1
Event: event1
Event: event2
Place: place2
Address: address2
Time: time1
Event: event1
Time: time2
Event: event1
Event: event2
Event: event3
Place: place3
Address: address3
Time: time1
Event: event1
Time: time2
Event: event1
Event: event2
Event: event3