Как отсортировать словарь по ключам вложенного словаря?

Как корректно отсортировать словарь по ключам вложенного словаря?

Например:

data = {
'key1':{'name':'John', 'job':'economist', 'date':'05.09.1967'}, 
'key2':{'name':'James', 'job':'ecologist', 'date':'15.04.1986'}, 
'key3':{'name':'Ivan', 'job':'owner', 'date':'23.11.1982'}, 
}

Как можно отсортировать такой словарь по значению date, чтобы на выходе получили порядок key1,key3,key2?

Пробовал .sort и sorted с lambda по key, но корректного результата не удалось достичь.


Ответы (2 шт):

Автор решения: MaxU

Решение с использованием Pandas:

import pandas as pd   # pip install pandas

df = pd.DataFrame(data).T
res = (df
       .assign(d=pd.to_datetime(df["date"]))
       .sort_values("d")
       .drop(columns="d")
       .to_dict("index"))

результат:

In [17]: res
Out[17]:
{'key1': {'name': 'John', 'job': 'economist', 'date': '05.09.1967'},
 'key3': {'name': 'Ivan', 'job': 'owner', 'date': '23.11.1982'},
 'key2': {'name': 'James', 'job': 'ecologist', 'date': '15.04.1986'}}
→ Ссылка
Автор решения: MaxU

Единственная "сложность" в данной задаче это то, что даты представлены как строки в формате dd.mm.YYYY, а при сравнении и сортировке строк используется лексикографический порядок сортировки.

Т.е. это когда "30.01.1900" > "01.01.2020", потому, что первый символ "3" > "0". Эту "проблему" можно решить либо преобразовав строку с датой к объекту типа datetime (см. решение ниже) либо изменив формат даты на YYYY.mm.dd - тогда востаточно будет сделать: res = dict(sorted(data.items(), key=lambda x: x[1].get("date")))

решение на Vanilla Python:

from datetime import datetime as DT

res = dict(sorted(data.items(), key=lambda x: DT.strptime(x[1].get("date"), "%d.%m.%Y")))

результат:

In [35]: res
Out[35]:
{'key1': {'name': 'John', 'job': 'economist', 'date': '05.09.1967'},
 'key3': {'name': 'Ivan', 'job': 'owner', 'date': '23.11.1982'},
 'key2': {'name': 'James', 'job': 'ecologist', 'date': '15.04.1986'}}
→ Ссылка