Как сделать хорошо построенный текст по примеру 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 - Покупка люстры