Манипуляции со списком словарей

Помогите, пожалуйста, составить код. Имеется список словарей:

slovar = [{code: 228, log: '08', time: datetime.datetime(2021, 9, 1, 7, 6, 3, 787903)}, 
          {code: 227, log: '18', time: datetime.datetime(2016, 1, 2, 7, 8, 1, 787903)}, 
          {code: 228, log: '56', time: datetime.datetime(2019, 5, 1, 2, 3, 3, 787903)}, 
          {code: 226, log: '82', time: datetime.datetime(2015, 4, 3, 7, 1, 3, 787903)}, 
          {code: 226, log: '76', time: datetime.datetime(2018, 9, 1, 5, 6, 1, 787903)}]

Нужно разделить словари на воображаемые группы по ключу code (то есть, чтобы они как будто поделились на группы. В одной группе словари с code: 228, в другой code: 227 и тд)

После надо отсортировать эти "воображаемые группы" по ключу time и получить самый актуальный по времени словарь из каждой группы, после чего взять из каждого словаря значения ключей code и log и сформировать из них словарь вида {code: log, code: log и тд}

Для понимания, на выходе после всех манипуляций должно быть так:

>>>{228: '08', 
    227: '18', 
    226: '76'}

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

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

Проще всего через Pandas:

import pandas as pd
import datetime

slovar = [{'code': 228, 'log': '08', 'time': datetime.datetime(2021, 9, 1, 7, 6, 3, 787903)}, 
          {'code': 227, 'log': '18', 'time': datetime.datetime(2016, 1, 2, 7, 8, 1, 787903)}, 
          {'code': 228, 'log': '56', 'time': datetime.datetime(2019, 5, 1, 2, 3, 3, 787903)}, 
          {'code': 226, 'log': '82', 'time': datetime.datetime(2015, 4, 3, 7, 1, 3, 787903)}, 
          {'code': 226, 'log': '76', 'time': datetime.datetime(2018, 9, 1, 5, 6, 1, 787903)}]

df = pd.DataFrame(slovar)
result = df.sort_values('time').groupby('code')['log'].last().to_dict()
print(result)

Вывод:

{226: '76', 227: '18', 228: '08'}

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

from collections import defaultdict

slovar = [{'code': 228, 'log': '08', 'time': datetime.datetime(2021, 9, 1, 7, 6, 3, 787903)}, 
          {'code': 227, 'log': '18', 'time': datetime.datetime(2016, 1, 2, 7, 8, 1, 787903)}, 
          {'code': 228, 'log': '56', 'time': datetime.datetime(2019, 5, 1, 2, 3, 3, 787903)}, 
          {'code': 226, 'log': '82', 'time': datetime.datetime(2015, 4, 3, 7, 1, 3, 787903)}, 
          {'code': 226, 'log': '76', 'time': datetime.datetime(2018, 9, 1, 5, 6, 1, 787903)}]

d = defaultdict(list)
for item in slovar:
    d[item['code']].append((item['time'], item['log']))
result = {k: sorted(v)[-1][1] for k, v in d.items()}
print(result)

Вывод:

{228: '08', 227: '18', 226: '76'}
→ Ссылка