【问题标题】:Dictionary sort by numer of days in month( in keys) in python字典在python中按月天数(键)排序
【发布时间】:2019-08-12 04:04:42
【问题描述】:

我正在尝试按月份的天数对字典进行排序。 (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, april,june..=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}

【问题讨论】:

  • 你试过sorted吗?另见stackoverflow.com/questions/39980323/…,请仅标记您正在使用的 Python 版本。
  • 字典应该被认为是无序的,即使它们在较新的 Python 版本中保持插入顺序。有序数据在列表中处理得更好。

标签: python python-3.x python-2.7 dictionary ordereddictionary


【解决方案1】:

如果您只想使用(打印、写入文件等)数据,则无需创建新的(有序)字典。只需输出项目列表(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)]

注意:如果可以,请避免使用月份名称作为键,因为它们会发生变化:“一月”与“一月”,外语,...

【讨论】:

    【解决方案2】:

    您无法对字典进行排序,因为它是无序的。你可以使用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)])
    

    【讨论】:

      猜你喜欢
      • 2011-01-25
      • 1970-01-01
      • 2017-08-20
      • 2019-04-21
      • 2017-05-30
      • 2021-11-27
      • 2011-06-17
      • 2015-01-04
      相关资源
      最近更新 更多