Как отсортировать обьект массива с вложеным JSON по дате ключа?
Как отсортировать обьект массива с вложеным JSON по дате ключа?
data = [{
"history_date": "23.05.2021, 6:52",
"history_text": "Такси в ожидании"
},
{
"history_date": "24.05.2021, 8:52",
"history_text": "Такси в ожидании"
},
{
"history_date": "25.05.2021, 9:52",
"history_text": "Такси в ожидании"
}]
Чтобы получить в итоге тот же массив, только с сортировкой по дате.
data = [{
"history_date": "25.05.2021, 9:52",
"history_text": "Такси в ожидании"
},
{
"history_date": "24.05.2021, 8:52",
"history_text": "Такси в ожидании"
},
{
"history_date": "23.05.2021, 6:52",
"history_text": "Такси в ожидании"
}]
Пробую выполнить это так:
data = [
{"history_date": "23.05.2021, 6:52", "history_text": "Такси в ожидании" },
{"history_date": "24.05.2021, 8:52", "history_text": "Такси в ожидании" },
{"history_date": "25.05.2021, 9:52", "history_text": "Такси в ожидании" }
]
for i in data:
x = i['history_date']
# sorted([datetime.strptime(dt, "%Y.%m.%d, %H:%M") for dt in data])
res = sorted(data, key=x)
print(i)
print(res)
Пробую выполнить это так.
data = [{
"history_date": "23.05.2021, 6:52",
"history_text": "Такси в ожидании"
},
{
"history_date": "24.05.2021, 8:52",
"history_text": "Такси в ожидании"
},
{
"history_date": "25.05.2021, 9:52",
"history_text": "Такси в ожидании"
}]
for i in data:
x = i['history_date']
#sorted([datetime.strptime(dt, "%Y.%m.%d, %H:%M") for dt in data])
res = sorted(data, key=i)
print(i)
print(res)
Ответы (3 шт):
Автор решения: MaxU
→ Ссылка
Алгоритм решения:
- напишите функцию
get_date(dict_), которая принимает на вход один аргумент - элемент списка и возвращает значение по ключуhistory_dateв виде объекта типаdatetime. Пример элемента:{"history_date": "23.05.2021, 6:52", "history_text": "Такси в ожидании"} - укажите функцию
get_dateв качестве ключа сортировки:res = sorted(data, key=get_date, reverse=True)
Пример решения:
from datetime import datetime as DT
def get_date(x, format="%d.%m.%Y, %H:%M"):
return DT.strptime(x.get("history_date"), format)
res = sorted(data, key=get_date, reverse=True)
Проверка:
In [136]: data = [{
...: "history_date": "23.05.2021, 6:52",
...: "history_text": "Такси в ожидании"
...: },
...: {
...: "history_date": "24.05.2021, 8:52",
...: "history_text": "Такси в ожидании"
...: },
...: {
...: "history_date": "01.01.1970, 0:00",
...: "history_text": "Такси в ожидании"
...: }]
In [137]: res = sorted(data, key=get_date, reverse=True)
In [138]: res
Out[138]:
[
{'history_date': '24.05.2021, 8:52', 'history_text': 'Такси в ожидании'},
{'history_date': '23.05.2021, 6:52', 'history_text': 'Такси в ожидании'},
{'history_date': '01.01.1970, 0:00', 'history_text': 'Такси в ожидании'},
]
Автор решения: Rustam Aksenov
→ Ссылка
Решил так. True меняем на False. Регулируя сортировку по возрастанию-убыванию.
print(sorted(data, key=lambda x: datetime.datetime.strptime(x['history_date'], '%d.%m.%Y, %H:%M'), reverse=True))
Автор решения: Марина Архипцева
→ Ссылка
Или без выделения функции, через лямбду:
from datetime import datetime
data.sort(key=lambda x: datetime.strptime(x.get('history_date'), '%d.%m.%Y, %H:%M'), reverse=True)
теперь в data:
>>> data
[{'history_date': '25.05.2021, 9:52', 'history_text': 'Такси в ожидании'},
{'history_date': '24.05.2021, 8:52', 'history_text': 'Такси в ожидании'},
{'history_date': '23.05.2021, 6:52', 'history_text': 'Такси в ожидании'}]
Обратите внимание, что sort в отличие от sorted изменяет исходный список.