Как отсортировать словарь по ключам вложенного словаря?
Как корректно отсортировать словарь по ключам вложенного словаря?
Например:
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 шт):
Решение с использованием 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'}}
Единственная "сложность" в данной задаче это то, что даты представлены как строки в формате 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'}}