Манипуляции со списком словарей
Помогите, пожалуйста, составить код. Имеется список словарей:
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 шт):
Проще всего через 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'}