用月份和年份作为字符串对字典进行排序

时间:2021-04-18 17:10:00

标签: python dictionary

我有一本字典

a = {'MAR 96': '274.30', 'MAR 19': '39.05', 'MAR 04': '20.18', 'MAR 73': '20.18'}

我想按升序对这本词典进行排序。当字符串中的月份和年份添加到字符串中时,我该怎么做?

注意:3 月 73 日是指 1973 年

  1. 年份从 1950 年开始。
  2. 50-99 表示 1950 年到 1999 年
  3. 00-49 表示 2000 年到 2049 年
  4. 9 月 50 日意味着 1950 年

输出应该是

{'MAR 73': '20.18', 'MAR 96': '274.30', 'MAR 04': '20.18', 'MAR 19': '39.05'}

3 个答案:

答案 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 年的年份中不起作用。根据 documentationstrptime 的截止时间是 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'}