Преобразовать массив в короткую строку

Если минуты 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 шт):

Автор решения: dresqd

В вашем случае - проблема "слияния" не решается из-за того, что вы сравниваете целиком строку Пнд 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; Вск Вых
→ Ссылка