Преобразовать массив в короткую строку
Если минуты 00, то убрать их.
Если в массиве 0, то это выходной.
Если есть дни с одинаковым временем, то объединяем их через запятую.
При этом если одинаковое время подряд 3 дня и более, то объединить их дефисом.
Для дня может быть указано как два времени (начало и конец), так и одно (только начало), при этом одиночное время может быть завернуто в массив или нет.
def format_schedule(schedule):
days = ['Пнд', 'Втр', 'Срд', 'Чтв', 'Пят', 'Суб', 'Вск']
result = []
for i, slot in enumerate(schedule):
if isinstance(slot, list):
start_time = slot[0]
end_time = slot[1]
day = days[i]
result.append(f'{day} {start_time}-{end_time}')
else:
result.append('вых')
formatted_result = ''
for i in range(len(result)):
if i == 0 or result[i] != result[i - 1]:
formatted_result += result[i]
if i != len(result) - 1:
formatted_result += ' '
return formatted_result.replace('Пнд-Чтв', 'Пнд-Чтв').replace('Суб-Вск', 'Суб-Вск').replace('; ', ';').replace('Пнд-Чтв в', 'Пнд-Чтв').replace('Суб-Вск в', 'Суб-Вск').replace('; Пнд-Чтв', '; ').replace('; Суб-Вск', '; ').replace(';', '; ').replace(' ', ' ')
schedule = [
['09:00', '18:00'],
['09:00', '18:00'],
['09:00', '18:00'],
['09:00', '18:00'],
['11:00', '16:20'],
0,
0
]
formatted_schedule = format_schedule(schedule)
print(formatted_schedule)
Ответы (2 шт):
В вашем случае - проблема "слияния" не решается из-за того, что вы сравниваете целиком строку Пнд 09:00-18:00 на совпадение с Втр 09:00-18:00. Естественно из-за различия в названии дня - строки не совпадают и код не работает так, как вы хотите.
Решением проблемы слияния может быть что-то такое:
formatted_result = [] # для удобства вместо строки использую список
while True: # цикл для перебора всех элементов result, выйдем по окончании перебора элементов
start_day = result[0][0] # тут живет первый день из группы дней с совпадающим расписанием
end_day = result[0][0] # последний день
for i, each in enumerate(result):
if i == len(result) - 1 or result[i][1] != result[i+1][1]:
if start_day != end_day:
formatted_result.append([f"{start_day}-{end_day}", result[i][1]])
del result[0:i+1]
else:
formatted_result.append([start_day, result[i][1]])
del result[0]
break
if result[i][1] == result[i+1][1]:
end_day = result[i+1][0]
if result == []:
break
print(formatted_result)
Код можно безболезненно внедрить в ваш и итоговый вид будет таким:
def format_schedule(schedule):
days = ['Пнд', 'Втр', 'Срд', 'Чтв', 'Пят', 'Суб', 'Вск']
result = []
for i, slot in enumerate(schedule):
if isinstance(slot, list):
start_time = slot[0]
end_time = slot[1]
day = days[i]
result.append([day, f'{start_time}-{end_time}'])
else:
result.append([days[i], 'вых'])
formatted_result = []
while True:
start_day = result[0][0]
end_day = result[0][0]
for i, each in enumerate(result):
if i == len(result) - 1 or result[i][1] != result[i+1][1]:
if start_day != end_day:
formatted_result.append([f"{start_day}-{end_day}", result[i][1]])
del result[0:i+1]
else:
formatted_result.append([start_day, result[i][1]])
del result[0]
break
if result[i][1] == result[i+1][1]:
end_day = result[i+1][0]
if result == []:
break
return formatted_result
schedule = [
['09:00', '18:00'],
['09:00', '18:00'],
['09:00', '18:00'],
['09:00', '18:00'],
['11:00', '16:20'],
0,
0
]
formatted_schedule = format_schedule(schedule)
print(formatted_schedule)
Используйте словарь для группировки дней
days = ['Пнд', 'Втр', 'Срд', 'Чтв', 'Пят', 'Суб', 'Вск']
sh = [['09:00', '10:00'], ['21:00', '22:00'], ['09:00', '10:00'], ['21:00', '22:00'], ['09:00', '10:00'], ['11:45', '16:20'], 0]
d = {}
for i, s in enumerate(sh):
if s in (0, [0]):
key = ('Вых',)
else:
key = tuple(s)
d.setdefault(key, []).append(days[i])
out = '; '.join(f"{', '.join(v)} {' - '.join(k)}" for k, v in d.items())
print(out)
Пнд, Срд, Пят 09:00 - 10:00; Втр, Чтв 21:00 - 22:00; Суб 11:45 - 16:20; Вск Вых