python词典排序列表

2024-10-01 15:40:21 发布

您现在位置:Python中文网/ 问答频道 /正文

可能这是一个复制品。我没有发现相同类型的问题 例如,我有一份字典目录

mylist=[
    {'month':'MAR2011','amount':90},
    {'month':'MAR2013','amount':190},
    {'month':'JUN2011','amount':290},
    {'month':'AUG2011','amount':930},
    {'month':'DEC2011','amount':30},
    {'month':'NOV2010','amount':40},
    {'month':'FEB 2013','amount':760},
    {'month':'SEP 2012','amount':330},
    {'month':'APR2013','amount':50},
    {'month':'NOV 2011','amount':450},
    {'month':'OCT 2012','amount':450},
]

我想得到这样的输出:

[
{'month':'FEB 2013','amount':760},
{'month':'MAR2011','amount':90},
{'month':'MAR2013','amount':190},
{'month':'APR 2013','amount':50},
{'month':'JUN2011','amount':290},
{'month':'AUG2011','amount':930},
{'month':'SEP 2012','amount':330},
{'month':'OCT 2012','amount':450},
{'month':'NOV2010','amount':40},
{'month':'NOV 2011','amount':450},
{'month':'DEC2011','amount':30},
]

不想考虑今年。按月份排序。你知道吗

提前谢谢


Tags: 类型字典amountoctnovsepfeb复制品
2条回答

首先创建一个映射字典,将月份映射为数字:

>>> import re
>>> import pprint
>>> dic = {'JAN':1,'FEB':2,'MAR':3,'APR':4,'MAY':5,'JUN':6,'JULY':7,'AUG':8,'SEP':9,'OCT':10,'NOV':11,'DEC':12}
def func(x):
    m = re.search(r'[A-Z]+',x['month'])
    return dic[m.group(0)]
... 
>>> pprint.pprint(sorted(mylist, key = func))
[{'amount': 760, 'month': 'FEB 2013'},
 {'amount': 90, 'month': 'MAR2011'},
 {'amount': 190, 'month': 'MAR2013'},
 {'amount': 50, 'month': 'APR2013'},
 {'amount': 290, 'month': 'JUN2011'},
 {'amount': 930, 'month': 'AUG2011'},
 {'amount': 330, 'month': 'SEP 2012'},
 {'amount': 450, 'month': 'OCT 2012'},
 {'amount': 40, 'month': 'NOV2010'},
 {'amount': 450, 'month': 'NOV 2011'},
 {'amount': 30, 'month': 'DEC2011'}]

创建将月份映射到序号的字典:

from calendar import month_abbr

month_to_index = {month.upper(): i for i, month in enumerate(month_abbr[1:])}

然后用它来排序:

sorted(mylist, key=lambda d: month_to_index[d['month'][:3]])

演示:

>>> from calendar import month_abbr
>>> month_to_index = {month.upper(): i for i, month in enumerate(month_abbr[1:])}
>>> import pprint
>>> pprint.pprint(sorted(mylist, key=lambda d: month_to_index[d['month'][:3]]))
[{'amount': 760, 'month': 'FEB 2013'},
 {'amount': 90, 'month': 'MAR2011'},
 {'amount': 190, 'month': 'MAR2013'},
 {'amount': 50, 'month': 'APR2013'},
 {'amount': 290, 'month': 'JUN2011'},
 {'amount': 930, 'month': 'AUG2011'},
 {'amount': 330, 'month': 'SEP 2012'},
 {'amount': 450, 'month': 'OCT 2012'},
 {'amount': 40, 'month': 'NOV2010'},
 {'amount': 450, 'month': 'NOV 2011'},
 {'amount': 30, 'month': 'DEC2011'}]

要按第一个月、第二个年排序,请从键函数返回一个元组:

sorted(mylist, key=lambda d: (month_to_index[d['month'][:3]], d['month'][-4:]))

演示:

>>> pprint.pprint(sorted(mylist, key=lambda d: (month_to_index[d['month'][:3]], d['month'][-4:])))
[{'amount': 760, 'month': 'FEB 2013'},
 {'amount': 90, 'month': 'MAR2011'},
 {'amount': 190, 'month': 'MAR2013'},
 {'amount': 50, 'month': 'APR2013'},
 {'amount': 290, 'month': 'JUN2011'},
 {'amount': 930, 'month': 'AUG2011'},
 {'amount': 330, 'month': 'SEP 2012'},
 {'amount': 450, 'month': 'OCT 2012'},
 {'amount': 40, 'month': 'NOV2010'},
 {'amount': 450, 'month': 'NOV 2011'},
 {'amount': 30, 'month': 'DEC2011'}]

在这种特定情况下没有区别,因为每月数据已经按排序顺序排列。你知道吗

相关问题 更多 >

    热门问题