#python-3.x #ordereddict
Вопрос:
У меня есть словарь, в котором в качестве ключа и значения используется комбинация год-месяц. Я использовал OrderedDict для сортировки словаря и получения результата, как показано ниже. В моем ожидаемом результате после «2021-1» должно быть «2021-2». Но «2021-10» будет между ними.
{
"2020-11": 25,
"2020-12": 861,
"2021-1": 935,
"2021-10": 1,
"2021-2": 4878,
"2021-3": 6058,
"2021-4": 3380,
"2021-5": 4017,
"2021-6": 1163,
"2021-7": 620,
"2021-8": 300,
"2021-9": 7
}
Мой ожидаемый результат должен быть таким, как показано ниже. Я хочу, чтобы словарь был отсортирован по наименьшей дате до последней даты
{
"2020-11": 25,
"2020-12": 861,
"2021-1": 935,
"2021-2": 4878,
"2021-3": 6058,
"2021-4": 3380,
"2021-5": 4017,
"2021-6": 1163,
"2021-7": 620,
"2021-8": 300,
"2021-9": 7,
"2021-10": 1
}
Буду признателен, если вы сможете помочь.
Комментарии:
1. Это из-за лексической сортировки строк. Исправьте формат даты, чтобы в нем всегда был двузначный месяц (например
2021-01
), и проблема исчезнет.2. строки сортируются лексикографически. подсказка : используйте
datetime
модуль для анализа строки, а затем сортировкиdatetime
объектов.
Ответ №1:
Если вы хотите настроить способ сортировки, используйте sorted
параметр with key
:
from typing import OrderedDict
from decimal import Decimal
data = {
"2020-11": 25,
"2020-12": 861,
"2021-1": 935,
"2021-10": 1,
"2021-2": 4878,
"2021-3": 6058,
"2021-4": 3380,
"2021-5": 4017,
"2021-6": 1163,
"2021-7": 620,
"2021-8": 300,
"2021-9": 7
}
def year_plus_month(item):
key = item[0].replace("-", ".")
return Decimal(key)
data_ordered = OrderedDict(sorted(data.items(), key=year_plus_month))
print(data_ordered)
Я использовал Decimal
вместо float
этого, чтобы избежать какой-либо шаткой точности с плавающей запятой.