Как сделать хорошо построенный текст по примеру Python

Всё почти сделал но ломаю голову над одним, к делу

У меня есть вот такой код:

        operations = func.operations()
        #Getting data
        final_str = ''
        for opertime in operations:
            regtime1 = datetime.datetime.fromtimestamp(int(opertime[1]))
            formatedate1 = regtime1.strftime("%m.%d.%Y")
            formatetime1 = regtime1.strftime("%H:%M")
            
            final_str += '\n'+formatetime1 + ' - ' + opertime[0]

В нем, программа получает из бд 2 столбца в котором (operation, time). В первом какая операция была и во втором время операции. Я хочу сделать сделать всё в вот таком виде:

- Дата: 02.05.2022

16:02 - Покупка шампуня

15:58 - Покупка утюга

12:13 - Покупка подписки

10:25 - Покупка карты

- Дата: 01.05.2022

22:20 - Покупка подписки

17:05 - Покупка бытовой техники

16:59 - Покупка мяса

16:58 - Покупка фена

Как вы видите дата не повторяется возле каждой новой строки, а только в том случае если наступил новый день, как это возможно сделать более менее нормально, жду ваши варианты!


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

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

Если операции сгруппировать по дате, то проблем вывести не будет

Пример:

import datetime as DT
from collections import defaultdict


operations = [
    ('Покупка мяса', 1650456884),
    ('Покупка техники', 1650463121),
    ('Покупка машины', 1650463177),
    ('Покупка кольца', 1650463544),
    ('Покупка листа А4', 1650482406),
    ('Покупка товара', 1650523818),
    ('Покупка подписки', 1650525954),
    ('Покупка фена', 1650532411),
    ('Покупка люстры', 1650545934),
]

date_by_operations = defaultdict(list)
for name, timestamp in operations:
    regtime = DT.datetime.fromtimestamp(timestamp)
    date_by_operations[regtime.date()].append(
        (regtime.time(), name)
    )

for date, ops in date_by_operations.items():
    print(f'- Дата: {date:%d.%m.%Y}')

    for time, name in ops:
        print(f'{time:%H:%M} - {name}')

    print()

Результат:

- Дата: 20.04.2022
17:14 - Покупка мяса
18:58 - Покупка техники
18:59 - Покупка машины
19:05 - Покупка кольца

- Дата: 21.04.2022
00:20 - Покупка листа А4
11:50 - Покупка товара
12:25 - Покупка подписки
14:13 - Покупка фена
17:58 - Покупка люстры
→ Ссылка
Автор решения: SergFSM

для группировки можно воспользоваться itertools:

from datetime import datetime
from itertools import groupby

operations = [
    ('Покупка мяса', 1650456884),
    ('Покупка техники', 1650463121),
    ('Покупка машины', 1650463177),
    ('Покупка кольца', 1650463544),
    ('Покупка листа А4', 1650482406),
    ('Покупка товара', 1650523818),
    ('Покупка подписки', 1650525954),
    ('Покупка фена', 1650532411),
    ('Покупка люстры', 1650545934)]

op = map(lambda x: (x[0], datetime.fromtimestamp(x[1])), operations)

for d, g in groupby(op, lambda x: x[1].date()):
    print(f'- Дата: {d:%d.%m.%Y}')
    for o, t in g:
        print(f'{t:%H:%M} - {o}')

'''
- Дата: 20.04.2022
15:14 - Покупка мяса
16:58 - Покупка техники
16:59 - Покупка машины
17:05 - Покупка кольца
22:20 - Покупка листа А4
- Дата: 21.04.2022
09:50 - Покупка товара
10:25 - Покупка подписки
12:13 - Покупка фена
15:58 - Покупка люстры
→ Ссылка