Сортировка словаря по ключу

#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 этого, чтобы избежать какой-либо шаткой точности с плавающей запятой.