Сортировка словаря по количеству дней в месяце (в ключах) в python - PullRequest
2 голосов
/ 21 марта 2019

Я пытаюсь отсортировать словарь по количеству дней в месяце. (30,31 и 28). Я пытался добиться этого с помощью календарного модуля и модуля даты и времени, но не получил желаемого результата. Любое предложение !!

product_sell= {'November':680,'August':678,'October':857,'January': 125,'April':989,'February': 300, 'September':120,'March':259,'December':899,'June':368, 'May':31,'July':968}

ожидаемый результат (сортировка (ключи) по количеству месяцев в днях jan, март ... = 31, фев = 28, апрель, июнь .. = 30)

product_sell= {'January': 125, 'March':259, 'May':31, 'July':968, 'August':678,  'October':857, 'December':899, 'April':989, 'June':368, 'September':120, 'November':680, 'February': 300}

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Вы не можете сортировать словари, потому что они беспорядочные. Вы можете использовать orderdict для достижения этой цели.

from collections import OrderedDict

product_sell= {'November':680,'August':678,'October':857,'January': 125,'April':989,'February': 300, 'September':120,'March':259,'December':899,'June':368, 'May':31,'July':968}
months = ['January','February','March','April','May','June','July','August','September','October','November','December']

OrderedDict(sorted(product_sell.items(),key =lambda x:months.index(x[0])))

Выход:

OrderedDict([('January', 125),
         ('February', 300),
         ('March', 259),
         ('April', 989),
         ('May', 31),
         ('June', 368),
         ('July', 968),
         ('August', 678),
         ('September', 120),
         ('October', 857),
         ('November', 680),
         ('December', 899)])
0 голосов
/ 21 марта 2019

Вам не нужно создавать новый (упорядоченный) словарь, если вы просто хотите использовать (распечатать, записать в файл, ...) данные.Просто выведите список элементов (month, count).

>>> product_sell= {'November':680,'August':678,'October':857,'January': 125,'April':989,'February': 300, 'September':120,'March':259,'December':899,'June':368, 'May':31,'July':968}    

Сначала вы можете создать ключ сортировки по месяцам:

>>> import calendar
>>> key_by_month = dict(zip(calendar.month_name[1:], [(-calendar.monthrange(2019,i)[1], i) for i in range(1,13)]))
>>> key_by_month
{'January': (-31, 1), 'February': (-28, 2), 'March': (-31, 3), 'April': (-30, 4), 'May': (-31, 5), 'June': (-30, 6), 'July': (-31, 7), 'August': (-31, 8), 'September': (-30, 9), 'October': (-31, 10), 'November': (-30, 11), 'December': (-31, 12)}

Месяцы будут отсортированы по количеству дней (по убыванию,отсюда знак минус), а затем по их естественному порядку.

Во-вторых, используйте sorted и найдите ключ по названию месяца:

>>> sorted(product_sell.items(), key=lambda m_c: key_by_month[m_c[0]])
[('January', 125), ('March', 259), ('May', 31), ('July', 968), ('August', 678), ('October', 857), ('December', 899), ('April', 989), ('June', 368), ('September', 120), ('November', 680), ('February', 300)]

Примечание. Если можно, избегайте использованияназвания месяцев в качестве ключей, потому что они подвержены изменениям: "январь" против "январь", иностранные языки, ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...