根据第一个元素排序元组列表
如何根据元组的第一个值来对一组元组进行排序?就像在字典中,我们可以使用 sorted(a.keys())
来排序字典的键。
那么对于一组元组,我们该怎么做呢?
如果这些是元组的值:
t = [('2010-09-11', 'somedata', somedata),
('2010-06-11', 'somedata', somedata),
('2010-09-12', 'somedata', somedata)]
这些元组应该根据第一个字段中的日期进行排序。
4 个回答
或者你可以使用类似这样的方式,来确保按照日期排序的元组列表:
from datetime import datetime
initData = [('2010-09-11','somedata',1), ('2010-06-11','somedata',2), ('2010-09-12','somedata',3)]
outData = sorted(initData , key=lambda x: datetime.strptime(x[0],"%Y-%m-%d"))
如果'2010-09-11'是年-月-日格式,你可以这样做:
somedata = 'jyhghg'
t = [('2010-09-11','somedata',somedata),
('2010-06-11','somedata',somedata),
('2010-09-12','somedata',somedata),
('2010-08-12','somedata',somedata)]
from operator import itemgetter
t.sort(key = itemgetter(0))
print t
结果
[('2010-06-11', 'somedata', 'jyhghg'),
('2010-08-12', 'somedata', 'jyhghg'),
('2010-09-11', 'somedata', 'jyhghg'),
('2010-09-12', 'somedata', 'jyhghg')]
.
如果'2010-09-11'是年-日-月格式,你可以这样做:
from time import strptime,strftime
somedata = 'jyhghg'
t = [('2010-09-11','somedata',somedata),
('2010-06-11','somedata',somedata),
('2010-09-12','somedata',somedata),
('2010-08-12','somedata',somedata)]
t.sort(key = lambda x: strftime('%Y%m%d',strptime(x[0],'%Y-%d-%m')))
print t
结果
[('2010-06-11', 'somedata', 'jyhghg'),
('2010-09-11', 'somedata', 'jyhghg'),
('2010-08-12', 'somedata', 'jyhghg'),
('2010-09-12', 'somedata', 'jyhghg')]
.
编辑 1
在阅读Artsiom Rudzenka的回答时,他单独使用了strptime(),我意识到strptime()会生成一个struct_time对象,这个对象本身是有顺序的。这样的对象有一些属性,比如tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst
,你可以通过常见的点号方式来访问这些属性(比如toto.tm_mon),也可以通过索引方式访问(比如toto[1]),因为struct_time对象的属性是按这个顺序注册的tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst
。struct_time数据类型有一个命名元组的接口。
由于struct_time对象本身是有顺序的,所以不需要使用strftime()来获取一个按年-月-日
格式的日期字符串:这个顺序在struct_time对象中已经存在了。
然后,我修改了我的代码,以处理'2010-06-11'中11是月的情况:我去掉了strftime()。
from time import strptime
somedata = 'jyhghg'
t = [('2010-09-11','somedata',somedata),
('2010-06-11','somedata',somedata),
('2010-09-12','somedata',somedata),
('2010-08-12','somedata',somedata)]
t.sort(key = lambda x: strptime(x[0],'%Y-%d-%m'))
print t
编辑 2
考虑到Kirk Strauser的信息:
import re
regx = re.compile('(\d{4})-(\d\d)-(\d\d)')
somedata = 'jyhghg'
t = [('2010-09-11','somedata',somedata),
('2010-06-11','somedata',somedata),
('2010-09-12','somedata',somedata),
('2010-08-12','somedata',somedata)]
t.sort(key = lambda x: regx.match(x[0]).group(1,3,2))
print t
通常情况下,直接用 sorted(t)
就可以了,因为元组是按照字典顺序来排序的。如果你真的想要忽略第一个元素之后的所有内容(也就是说,不是按照后面的元素来排序那些第一个元素相同的元组),你可以提供一个 key
,让它只关注第一个元素。最简单的方法是用 operator.itemgetter
:
import operator
...
for item in sorted(t, key=operator.itemgetter(0)):
...
当然,如果你想要在原地排序这个列表,可以用 t.sort(key=operator.itemgetter(0))
来实现。