我有一个像
这样的python字典{'JUL':15,'MAR': 54,'DEC':65,'OCT':90}
我希望它按照月份来说排序,例如MAR,JUL,OCT和DEC在python中。
我该怎么做?
答案 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