如何对具有月份名称作为键的python字典进行排序

时间:2016-04-13 10:50:19

标签: python

我有一个像

这样的python字典
{'JUL':15,'MAR': 54,'DEC':65,'OCT':90}

我希望它按照月份来说排序,例如MAR,JUL,OCT和DEC在python中。

我该怎么做?

4 个答案:

答案 0 :(得分:6)

字典是无序的,你不能对字典进行排序。 您需要一个ordereddict,您可以从当前字典的键,值对的已排序元组列表中创建。

>>> months = ['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC']
>>> input = {'JUL':15,'MAR': 54,'DEC':65,'OCT':90}
>>> from collections import OrderedDict
>>> OrderedDict(sorted(input.items(),key =lambda x:months.index(x[0])))
OrderedDict([('MAR', 54), ('JUL', 15), ('OCT', 90), ('DEC', 65)])

答案 1 :(得分:4)

您希望按月份的数量对它们进行排序,因此您需要创建从月份缩写到该月份数量的映射:

dic = {'JUL':15, 'MAR': 54,'DEC':65,'OCT':90}

import calendar
month_numeric_mapping = {abb: index for abb in dic 
                                    for index, long in enumerate(calendar.month_name[1:]) 
                                    if str.lower(abb) in str.lower(long)}

>>> month_numeric_mapping
{'DEC': 11, 'JUL': 6, 'MAR': 2, 'OCT': 9}

然后定义一个可以与sorted一起使用的函数来获取该数字:

def getMonthNumber(item):
    return month_numeric_mapping[item[0]]

最后你需要一个订单感知字典OrderedDict来存储已排序的输出:

>>> from collections import OrderedDict
>>> a = OrderedDict(sorted(dic.items(), key=getMonthNumber))
>>> a
OrderedDict([('MAR', 54), ('JUL', 15), ('OCT', 90), ('DEC', 65)])


另一种可能性是使用calendar.month_abbr

month_numeric_mapping = {abbr.upper(): i for i, abbr in enumerate(calendar.month_abbr[1:])}

def getMonthNumber(item):
    return month_numeric_mapping[item[0]]

a = OrderedDict(sorted(dic.items(), key=getMonthNumber))
>>> a
OrderedDict([('MAR', 54), ('JUL', 15), ('OCT', 90), ('DEC', 65)])

答案 2 :(得分:0)

密钥排序函数,如PHP ksort()

def ksort(d, func = None):
    keys = d.keys()
    keys.sort(func)
    return keys

for k in ksort(dic):
    print k, d[k]

答案 3 :(得分:0)

您可以使用集合模块在Python中使用Ordered Dictionaries。请参阅以下示例。

import collections

print 'Regular dictionary:'
d = {}
d['a'] = 'A'
d['b'] = 'B'
d['c'] = 'C'
d['d'] = 'D'
d['e'] = 'E'

for k, v in d.items():
    print k, v

print '\nOrderedDict:'
d = collections.OrderedDict()
d['a'] = 'A'
d['b'] = 'B'
d['c'] = 'C'
d['d'] = 'D'
d['e'] = 'E'

for k, v in d.items():
    print k, v

输出

Regular dictionary:
a A
c C
b B
e E
d D

OrderedDict:
a A
b B
c C
d D
e E