我有这个元组列表,我需要按年/月订购。
从2016/7
,2016/8
,2016/9
,2016/10
,2016/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)
]
,但输出并不是我所期待的。知道如何实现这个输出吗?
答案 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"))