我试图按月的天数对字典进行排序。 (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,march ... = 31,feb = 28,4月,6月.. = 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}
你不能对字典进行排序,因为它是无序的。您可以使用ordereddict来实现此目的。
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)])
如果您只想使用(打印,写入文件,......)数据,则无需创建新的(有序)字典。只需输出(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)]
注意:如果可以,请避免使用月份名称作为键,因为它们可能会有变化:“january”vs“January”,外语,......