from collections import defaultdict
from csv import DictReader

#Задача: Скажем в некое заведение заходят люди. Есть время входа и время выхода.
#Необходимо определить в какие интервалы времени было максимальное количество человек.
#Задача на нахождение максимального числа накладывания друг на друга отрезков

#РЕШЕНИЕ
#Открываем файл с данными и создаём из него список словарей,
#где за каждым значением в качестве ключа закреплено название колонки
with open('data.csv', 'r') as fail:
    data_dict = DictReader(fail)
    data_arr_of_dict = list(data_dict)

#создаём переменную-словарь в который мы будем заносить
#ключи (вход и выход) c флагом (+1 - вход или -1 - выход)
in_out = defaultdict(lambda: 0)

#Собственно заполняем словарь ключами с флагами
for dic in data_arr_of_dict:
    in_out[dic['came_in']] += 1
    in_out[dic['came_out']] -= 1

#Для того, что бы нам далее подсчитать число вхождений в каждый временной
#интервал нам нужен сортированный список времени входа и выхода в одну лининю
sort_in_out = sorted(in_out)

#Создаём переменную-счётчик вхождений - count, переменную known_max в которую мы будем заносить
#максимальное значение вхождение во время итерации по списку времени и список intervals,
#в который мы будем заносить интервалы с максимальным числом вхождений
count = 0
known_max = 0
intervals = []

#Проходимся по списку времени и прибавляем к переменной count
#количество вхождений в выбранное время, а затем, сравниваем
#максимальное число вхождений с переменной count.
#на выходе из цикла for мы получаем максимальное число вхождений
#и список интервалов, в которых было максимальное число вхождений
for i in range(0, len(in_out)-1):
    start = sort_in_out[i]
    end = sort_in_out[i+1]
    count += in_out[start]
    if count > known_max:
        known_max = count
        intervals = [(start, end)]
    elif count == known_max:
        intervals.append((start, end))

print(known_max)
print(intervals)