#python #python-3.x #dictionary
#python #python-3.x #словарь
Вопрос:
Мне нужно отфильтровать вложенный словарь из списка словаря на основе диапазона дат
вот мой список:
[{'5-jan-2019': '34'}, {'10-jan-2019': '34'}, {'21-jan-2019': '12'}, {'25-jan-2019': '34'} , {'5-feb-2019': '34'}]
Мне нужно отфильтровать весь вложенный словарь в диапазоне дат, например
from_date-'5-jan-2019' and to_date-'25-jan-2019'
и добавьте его в новый словарь
ожидаемый результат
{
'5-jan-2019': '34',
'10-jan-2019': '34',
'21-jan-2019': '12',
'25-jan-2019': '34'
}
Ответ №1:
Вы хотите, чтобы datetime.strptime преобразовывал строки в объекты datetime, которые затем можно сравнивать друг с другом.
from datetime import datetime
lst = [
{'5-jan-2019': '34'},
{'10-jan-2019': '34'},
{'21-jan-2019': '12'},
{'25-jan-2019': '34'},
{'5-feb-2019': '34'},
]
dt_from_str = lambda dt: datetime.strptime(dt, '%d-%b-%Y')
start_date = dt_from_str('5-jan-2019')
end_date = dt_from_str('25-jan-2019')
new_dict = {}
for sub_dict in lst:
for key, val in sub_dict.items():
if start_date <= dt_from_str(key) <= end_date:
new_dict[key] = val
print(new_dict)
вывод:
{
'5-jan-2019': '34',
'10-jan-2019': '34',
'21-jan-2019': '12',
'25-jan-2019': '34',
}
Ответ №2:
Вы можете использовать datetime
модуль для использования встроенных методов сравнения ( __lt__
и т.д.) datatime.datetime
объекта:
import datetime
data = [{'5-jan-2019': '34'}, {'10-jan-2019': '34'}, {'21-jan-2019': '12'}, {'25-jan-2019': '34'} , {'5-feb-2019': '34'}]
start, end = '5-jan-2019', '25-jan-2019'
def d_form(d):
months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec']
_d, _m, _y = d.split('-')
return datetime.datetime(int(_y), months.index(_m) 1, int(_d))
start, end = d_form(start), d_form(end)
final_result = [i for i in data if start <= d_form(list(i.keys())[0]) <= end]
Вывод:
[{'5-jan-2019': '34'},
{'10-jan-2019': '34'},
{'21-jan-2019': '12'},
{'25-jan-2019': '34'}]