Как отсортировать обьект массива с вложеным 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

Алгоритм решения:

  1. напишите функцию get_date(dict_), которая принимает на вход один аргумент - элемент списка и возвращает значение по ключу history_date в виде объекта типа datetime. Пример элемента: {"history_date": "23.05.2021, 6:52", "history_text": "Такси в ожидании"}
  2. укажите функцию 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 изменяет исходный список.

→ Ссылка