Я также предполагаю, что вы хотите:
(а) Объединение последовательных назначений (то есть одно, начинающееся сразу после окончания предыдущего)
(б) Отформатируйте их, как показано выше
(c) Сгруппируйте их по дням в сведенные списки.
Если это так, вы можете решить эту проблему, используя следующий подход:
(a) Создайте вспомогательную функцию, которая преобразует ваши дневные, часовые и минутные переменные в минуты:
def get_minute_val(day_val,hour_val,min_val):
return (24*60*day_val)+(60*hour_val)+min_val
(b) Создайте функцию, которая принимает два назначения, и либо объединяет их в одно, если они являются последовательными, либо возвращает их нескомбинированными, если они не
def combine_if_consec(first,second):
#Check whether appointments are consecutive
if( get_minute_val(first[0],first[3],first[4]) + 1 ==
get_minute_val(second[0],second[1],second[2])):
#If so, return list containing combined appointment
return [[first[0],first[1],first[2],second[3],second[4]]]
else:
#Else return uncombined appointments
return [first,second]
(c) Повторно вызывайте его при каждой встрече в списке, сравнивая с последней добавленной встречей. У меня есть немного хакерский способ справиться с первым назначением.
def combine_all_appointments(app_list):
#Add first appointment to app list
output_list = [test[0]]
#Loop through remaining appointments
for next_app in app_list[1:]:
#Remove most recent appointment to output list
prev_app = output_list.pop()
#Add either 2 combined appointments, or one single appointment to outputlist
output_list += combine_if_overlap(prev_app,next_app)
return output_list
(d) Создайте функцию, которая выполняет желаемое форматирование
def format_appointments(app_list):
return [[x[0],'%d:%02d' % (x[1],x[2]),'%d:%02d' %(x[3],x[4])] for x in app_list]
(e) и отдельная группировка встреч по дням и выравнивание по дням.
def group_by_day(app_list):
output = {}
#Loop through appointments
for app in app_list:
#Create new entry if day not yet in output dict
if app[0] not in output:
output[app[0]] = app[1:]
#Add appointment values to relevant day
else:
output[app[0]] += app[1:]
#Flatten dictionary
return [[k, *output[k]] for k in output]
Проверка этого на вашем входе:
test = [[0, 4, 0, 4, 59],[0, 5, 0, 5, 59], [0, 6, 0, 6, 59], [0, 13, 0, 13, 59], [0, 14, 0, 14, 59], [0, 21, 0, 21, 59], [0, 22, 0, 22, 59], [1, 5, 0, 5, 59], [1, 6, 0, 6, 59], [1, 13, 0, 13, 59], [1, 14, 0, 14, 59], [1, 21, 0, 21, 59], [1, 22, 0, 22, 59], [2, 5, 0, 5, 59], [2, 6, 0, 6, 59], [2, 13, 0, 13, 59], [2, 14, 0, 14, 59], [2, 21, 0, 21, 59], [2, 22, 0, 22, 59], [3, 5, 0, 5, 59], [3, 6, 0, 6, 59], [3, 13, 0, 13, 59], [3, 14, 0, 14, 59], [3, 21, 0, 21, 59], [3, 22, 0, 22, 59], [4, 5, 0, 5, 59], [4, 6, 0, 6, 59], [4, 13, 0, 13, 59], [4, 14, 0, 14, 59], [4, 21, 0, 21, 59], [4, 22, 0, 22, 59], [5, 5, 0, 5, 59], [5, 6, 0, 6, 59], [5, 13, 0, 13, 59], [5, 14, 0, 14, 59], [5, 21, 0, 21, 59], [5, 22, 0, 22, 59], [6, 5, 0, 5, 59], [6, 6, 0, 6, 59], [6, 13, 0, 13, 59], [6, 14, 0, 14, 59], [6, 21, 0, 21, 59], [6, 22, 0, 22, 59]]
app_list = combine_all_appointments(test)
formatted = format_appointments(app_list)
grouped = group_by_day(formatted)
возвращает
[[0, '4:00', '6:59', '13:00', '14:59', '21:00', '22:59'], [1, '5:00', '6:59', '13:00', '14:59', '21:00', '22:59'], [2, '5:00', '6:59', '13:00', '14:59', '21:00', '22:59'], [3, '5:00', '6:59', '13:00', '14:59', '21:00', '22:59'], [4, '5:00', '6:59', '13:00', '14:59', '21:00', '22:59'], [5, '5:00', '6:59', '13:00', '14:59', '21:00', '22:59'], [6, '5:00', '6:59', '13:00', '14:59', '21:00', '22:59']]