как реализовать алгоритм слияния ID с записями?

я пишу телеграм бота, который должен утром напоминать о делах, которые запланированы на день. логика работы: бот проверяет, есть ли в базе данных какие-то дела, запланированные на сегодняшнюю дату. если да, то сохраняет строки из БД в массиве в виде:

[{'id': 1234, 'record': record1, 'time': time1, 'date': date1},
{'id': 1234, 'record': record2, 'time': time2, 'date': date2},
{'id': 4567, 'record': record3, 'time': time3, 'date': date3},
{'id': 4567, 'record': record4, 'time': time4, 'date': date4},
...]

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

{ 1234: 
        [ { 'record': record1, 'time': time1, 'date': date1 },
          { 'record': record2, 'time': time2, 'date': date2 }],
4567:   
        [ { 'record': record3, 'time': time3, 'date': date3 },
          { 'record': record4, 'time': time4, 'date': date4 }]
}

проблема в том, что у меня не получается это реализовать. как это сделать?


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

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

Советую, если используете pycharm, установить плагин Github Copilot. Он мне практически выдал сразу вот это, но с небольшой корректировкой

nput_ = [{'id': 1234, 'record': "record1", 'time': 'time1', 'date': 'date1'},
     {'id': 1234, 'record': "record2", 'time': 'time2', 'date': 'date2'},
     {'id': 4567, 'record': "record3", 'time': 'time3', 'date': 'date3'},
     {'id': 4567, 'record': "record4", 'time': 'time4', 'date': 'date4'}, ]

res = {}

for i in input_:
    if i['id'] not in res:
        res[i['id']] = []
    new_data = i.copy()
    new_data.pop('id')
    res[i['id']].append(new_data)

Результат

{1234: [{'date': 'date1', 'record': 'record1', 'time': 'time1'},
        {'date': 'date2', 'record': 'record2', 'time': 'time2'}],
 4567: [{'date': 'date3', 'record': 'record3', 'time': 'time3'},
        {'date': 'date4', 'record': 'record4', 'time': 'time4'}]}
→ Ссылка
Автор решения: Namerek
import json

l = [{'id': 1234, 'record': 'record1', 'time': 'time1', 'date': 'date1'},
{'id': 1234, 'record': 'record2', 'time': 'time2', 'date': 'date2'},
{'id': 4567, 'record': 'record3', 'time': 'time3', 'date': 'date3'},
{'id': 4567, 'record': 'record4', 'time': 'time4', 'date': 'date4'}]

tasks = dict()
for item in l:
    id_ = item.pop('id')
    tasks[id_] = tasks.setdefault(id_, []) + [item]
print(json.dumps(
    tasks,
    ensure_ascii=False,
    indent=2
))

{
  "1234": [
    {
      "record": "record1",
      "time": "time1",
      "date": "date1"
    },
    {
      "record": "record2",
      "time": "time2",
      "date": "date2"
    }
  ],
  "4567": [
    {
      "record": "record3",
      "time": "time3",
      "date": "date3"
    },
    {
      "record": "record4",
      "time": "time4",
      "date": "date4"
    }
  ]
}
→ Ссылка