我有一本字典
a = {'MAR 96': '274.30', 'MAR 19': '39.05', 'MAR 04': '20.18', 'MAR 73': '20.18'}
我想按升序对这本词典进行排序。当字符串中的月份和年份添加到字符串中时,我该怎么做?
注意:3 月 73 日是指 1973 年
输出应该是
{'MAR 73': '20.18', 'MAR 96': '274.30', 'MAR 04': '20.18', 'MAR 19': '39.05'}
答案 0 :(得分:2)
您可以使用 strptime
来解析日期字符串,并使用单行。
import datetime as dt
a = {'MAR 96': '274.30', 'MAR 19': '39.05', 'MAR 04': '20.18', 'MAR 73': '20.18'}
sorted(a.items(), key=lambda item: dt.datetime.strptime(item[0], '%b %y'))
如果给出年份的 2 位数,这将利用 strptime 将如何解析年份。
注意:正如评论中提到的,这在小于 69 年的年份中不起作用。根据 documentation,strptime
的截止时间是 1969 年。
答案 1 :(得分:1)
您可以创建一个查询,将您的月份映射到一个数字(为简单起见在此处被截断)。然后决定一个世纪结束的年份的截止日期。使用 50。49 将是 2049,50 将是 1950。然后您只需要一个函数将您的字符串转换为元组,可用于排序。如果您使用的是保留 dict 排序的 python 版本,则可以将排序后的 items()
传递回 dict()
:
a = {'JAN 50': '274.30', 'MAR 49': '274.30', 'APR 19': '19.05', 'MAR 19': '39.05', 'MAR 04': '20.18', 'MAR 73': '20.18'}
def get_sort(s):
MONTHS = {
'JAN': 0,
'FEB': 1,
'MAR': 2,
'APR': 3
}
CENTURY_BORDER = 50
mon, year = s[0].split()
year = int(year)
if year < CENTURY_BORDER:
year += 2000
else:
year += 1900
return (year, MONTHS[mon])
dict(sorted(a.items(), key=get_sort))
结果:
{'JAN 50': '274.30',
'MAR 73': '20.18',
'MAR 04': '20.18',
'MAR 19': '39.05',
'APR 19': '19.05',
'MAR 49': '274.30'}
您可以看到,将项目传递给 get_sort()
将返回一个您需要进行排序的元组:
get_sort(("JAN 50", '274.30'))
# (1950, 0)
答案 2 :(得分:1)
这是使用 datetime
模块的解决方案。您将获得一组元组,您可以将其转换为 dict
。
注意,从 Python 3.7 版开始,字典是有序的。在 Python 3.6 及更早版本中,字典是无序的。
代码:
import datetime
a = {'MAR 50': '274.30', 'MAR 96': '274.30', 'MAR 19': '39.05', 'MAR 04': '20.18', 'MAR 73': '20.18'}
def get_key(tup):
k = tup[0]
d = int(k.split(' ')[1])
new_key = '19' + '%02d' % d if d >= 50 else '20' + '%02d' % d
new_key = k[:-2] + new_key
return datetime.datetime.strptime(new_key, '%b %Y')
b = sorted(a.items(), key=get_key)
print(b)
print(dict(b))
输出
[('MAR 50', '274.30'), ('MAR 73', '20.18'), ('MAR 96', '274.30'), ('MAR 04', '20.18'), ('MAR 19', '39.05')]
{'MAR 50': '274.30', 'MAR 73': '20.18', 'MAR 96': '274.30', 'MAR 04': '20.18', 'MAR 19': '39.05'}