按字符串日期年/月的顺序列表

时间:2017-12-10 16:30:41

标签: python python-2.7 list tuples

我有这个元组列表,我需要按年/月订购。

2016/72016/82016/92016/102016/11 ...到最后一年/月,在这种情况下{{1} }

2017/10

我已经尝试了visits_count = [ ('2017/9', 6175L), ('2017/8', 13522L), ('2016/10', 264L), ('2016/11', 227L), ('2016/7', 1519L), ('2017/1', 496L), ('2016/9', 726L), ('2017/3', 404L), ('2017/2', 253L), ('2017/5', 601L), ('2017/4', 151L), ('2017/7', 14300L), ('2017/6', 192L), ('2016/8', 2293L), ('2016/12', 28L), ('2017/10', 1333L) ] ,但输出并不是我所期待的。知道如何实现这个输出吗?

3 个答案:

答案 0 :(得分:2)

这不是dict,因此没有项目。对它进行排序会按字典顺序排序(例如'10'之前的月份'2')。因此,您必须提供适当的键函数,将年和月评估为数字而不是字符串:

# Py2
>>> sorted(visits_count, key=lambda tpl: map(int, tpl[0].split('/')))
# Py3
>>> sorted(visits_count, key=lambda tpl: list(map(int, tpl[0].split('/'))))
[('2016/7', 1519),
 ('2016/8', 2293),
 ('2016/9', 726),
 ('2016/10', 264),
 ('2016/11', 227),
 ('2016/12', 28),
 ('2017/1', 496),
 ('2017/2', 253),
 ('2017/3', 404),
 ('2017/4', 151),
 ('2017/5', 601),
 ('2017/6', 192),
 ('2017/7', 14300),
 ('2017/8', 13522),
 ('2017/9', 6175),
 ('2017/10', 1333)]

答案 1 :(得分:0)

使用key参数:

sorted(visits_count, key=lambda x: tuple(int(y) for y in x[0].split('/')))

或者,如果lambda要密集,请编写专用函数:

def make_date_tuple(value):
    return tuple(int(x) for x in value[0].split('/'))

sorted(visits_count, key=make_date_tuple)

Result:

[('2016/7', 1519),
 ('2016/8', 2293),
 ('2016/9', 726),
 ('2016/10', 264),
 ('2016/11', 227),
 ('2016/12', 28),
 ('2017/1', 496),
 ('2017/2', 253),
 ('2017/3', 404),
 ('2017/4', 151),
 ('2017/5', 601),
 ('2017/6', 19),
 ('2017/7', 14300),
 ('2017/8', 13522),
 ('2017/9', 6175),
 ('2017/10', 1333)]

make_date_tuple()的返回值用于排序。 您需要将字符串转换为两个整数,使用年份作为第一个月,将月份作为元组的第二个条目,例如(2016, 7)。 这导致排序,首先是按月和按月分类。

答案 2 :(得分:0)

如果您不需要最高性能,则可以使用故障安全日期时间库。

import datetime

visits_count = [
('2017/9', 6175), 
('2017/8', 13522), 
('2016/10', 264), 
('2016/11', 227), 
('2016/7', 1519), 
('2017/1', 496), 
('2016/9', 726), 
('2017/3', 404), 
('2017/2', 253), 
('2017/5', 601), 
('2017/4', 151), 
('2017/7', 14300), 
('2017/6', 192), 
('2016/8', 2293), 
('2016/12', 28), 
('2017/10', 1333)
]

sorted(visits_count,key=lambda x: datetime.datetime.strptime(x[0],"%Y/%m"))