Найти наибольшее значение в словаре
Всем привет. Нужна помощь по поиску ключей с наибольшей датой в словаре. Есть словарь ftp_json. Ключ это название файла, значение - дата {'rayon.arj': 'Jan-18-2007', 'RCLOSE.arj': 'Jun-23-2005', 'REAL.arj': 'Jun-23-2005', 'REASON.ARJ': 'Jan-29-2021', 'REGFAULT.arj': 'Oct-26-2015', 'ROS.ARJ': 'Nov-25-2019', 'ROSINKAS.ARJ': 'Feb-22-2022',...}. Он очень большой, там около 3000 ключей. В этом словаре мне нужны ключи соответствующие названиям, которые хранятся в списке daily_updated. Причем, значения в словаре ftp_json представляют собой название + дата(mmdd) (kgrd0112, cvhd0522 и т.д).
daily_updated = ('kgrd', 'cvhd', 'metd')
for sprav in daily_updated:
for arc_name, arc_date in ftp_json.items():
arc_name = arc_name.lower()
dateFormat = '%b-%d-%Y'
rc_date = dt.strptime(arc_date, dateFormat)
Итого:
daily_updated = ('kgrd', 'cvhd', 'metd')
ftp_json = {'kgrd0118.arj': 'Jan-18-2007',
'kgrd0623.arj': 'Jun-23-2005',
'kgrd0624.arj': 'Jun-24-2005',
'cvhd0629.ARJ': 'Jan-29-2021',
'cvhd1026.arj': 'Oct-26-2015',
'cvhd1125.ARJ': 'Nov-25-2019',
'cvhd0222.ARJ': 'Feb-22-2022',
'metd0228.ARJ': 'Feb-28-2022',
'metd0321.ARJ': 'Mar-26-2021',
}
result = ['kgrd0118.arj', 'cvhd0222.arj', 'metd0228.ARJ']
Сколько есть масок в списке daily_updated , столько и результатов хочу получить.
Ответы (1 шт):
первое, что приходит в голову - это использовать модуль pandas:
import pandas as pd
ftp_json = {'kgrd0118.arj': 'Jan-18-2007',
'kgrd0623.arj': 'Jun-23-2005',
'kgrd0624.arj': 'Jun-24-2005',
'cvhd0629.ARJ': 'Jan-29-2021',
'cvhd1026.arj': 'Oct-26-2015',
'cvhd1125.ARJ': 'Nov-25-2019',
'cvhd0222.ARJ': 'Feb-22-2022',
'metd0228.ARJ': 'Feb-28-2022',
'metd0321.ARJ': 'Mar-26-2021'}
daily_updated = ('kgrd', 'cvhd', 'metd')
df = pd.DataFrame(ftp_json.items(), columns=['key','value'])
result = (df.groupby(df['key'].apply(lambda x: next(i for i in daily_updated if i in x))).
apply(lambda x: df.loc[pd.to_datetime(x['value']).idxmax(),'key'])).tolist()
print(result)
'''
['cvhd0222.ARJ', 'kgrd0118.arj', 'metd0228.ARJ']
upd
а впрочем можно обойтись и без pandas:
from itertools import groupby
from datetime import datetime as dt
result = [max(g, key=lambda y: dt.strptime(y[1],'%b-%d-%Y'))[0]
for _,g in groupby(ftp_json.items(),
lambda x: next(i for i in daily_updated if i in x[0]))]