Сортировка списка, содержащего время

Есть список кортежей, содержащий дату и время:

s = [('26.02.2024', '12:00'), ('26.02.2024', '12:30'), ('26.02.2024', '13:00'), ('26.02.2024', '13:30'), ('26.02.2024', '15:00'), ('26.02.2024', '15:30'), ('26.02.2024', '17:00'), ('26.02.2024', '18:00')]

Необходимо список привести к такому виду:

s = [[('26.02.2024', '12:00'), ('26.02.2024', '12:30'), ('26.02.2024', '13:00'), ('26.02.2024', '13:30')], [('26.02.2024', '15:00'), ('26.02.2024', '15:30')], [('26.02.2024', '17:00')], [('26.02.2024', '18:00')]]

Т.е. список содержит списки кортежей отсортированных по следующему принципу: время должно идти друг за другом с интервалом в 30 минут. Если интервал не равен 30 минутам, то кортеж с этим временем добавляется в следующий список и т.д. Я пытаюсь сделать так:

spisok = [('26.02.2024', '12:00'), ('26.02.2024', '12:30'), ('26.02.2024', '13:00'), ('26.02.2024', '13:30'), ('26.02.2024', '15:00'), ('26.02.2024', '15:30'), ('26.02.2024','17:00'), ('26.02.2024', '18:00')]

spisok = [('26.02.2024', '12:00'), ('26.02.2024', '12:30'), ('26.02.2024', '13:00'), ('26.02.2024', '13:30'),
          ('26.02.2024', '15:00'), ('26.02.2024', '15:30'), ('26.02.2024', '17:00'), ('26.02.2024', '18:00')]

Я пытался это сделать так:

def func(s):
    x = 0
    y = 1
    spisok_sort = []
    spisok_no_sort = []
    for i in spisok:
        if y < len(spisok):
            date1 = datetime.strptime(spisok[x][1], '%H:%M')
            date2 = datetime.strptime(spisok[y][1], '%H:%M')
            if date2 - date1 == timedelta(minutes=30):
                if i not in spisok_sort:
                    spisok_sort.append(i)
                spisok_sort.append(spisok[x + 1])
                print(spisok_sort)
            else:
                spisok_no_sort.append(spisok[y])
            x += 1
            y += 1
    return spisok_sort

total_list = func(spisok)
print(total_list)

Подскажите, пожалуйста, как это можно сделать!


Ответы (1 шт):

Автор решения: ikikaidesu
# для сравнения времени
from datetime import datetime, timedelta
# массив дат
s = [('26.02.2024', '12:00'), ('26.02.2024', '12:30'), ('26.02.2024', '13:00'), 
     ('26.02.2024', '13:30'), ('26.02.2024', '15:00'), ('26.02.2024', '15:30'), 
     ('26.02.2024', '17:00'), ('26.02.2024', '18:00')]
# создаем массив с ответом 
answer = []
# временный массив для дат который пойдет в answer
l = []
# обходим массив дат
for i in s:
    # переводим дату в datetime формат
    i = datetime.strptime("{0} {1}".format(i[0], i[1]), "%d.%m.%Y %H:%M")
    # проверяем есть ли в l даты и если есть равна ли у них разница в 30 минут
    if len(l) > 0 and i - l[-1] == timedelta(minutes=30):
        l.append(i)
    # если нет
    else:
        # если что-то есть, то добавляем
        if len(l) > 0:
            answer.append(l)
        # обновляем временный список
        l = [i]
# добавляем последний элемент
if len(l) > 0:
    answer.append(l)
print(answer)
→ Ссылка