根据第一个元素排序元组列表

0 投票
4 回答
3426 浏览
提问于 2025-04-16 22:13

如何根据元组的第一个值来对一组元组进行排序?就像在字典中,我们可以使用 sorted(a.keys()) 来排序字典的键。

那么对于一组元组,我们该怎么做呢?

如果这些是元组的值:

t = [('2010-09-11', 'somedata', somedata),
     ('2010-06-11', 'somedata', somedata),
     ('2010-09-12', 'somedata', somedata)]

这些元组应该根据第一个字段中的日期进行排序。

4 个回答

1

或者你可以使用类似这样的方式,来确保按照日期排序的元组列表:

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"))
1

如果'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_isdststruct_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
7

通常情况下,直接用 sorted(t) 就可以了,因为元组是按照字典顺序来排序的。如果你真的想要忽略第一个元素之后的所有内容(也就是说,不是按照后面的元素来排序那些第一个元素相同的元组),你可以提供一个 key,让它只关注第一个元素。最简单的方法是用 operator.itemgetter

import operator
...
for item in sorted(t, key=operator.itemgetter(0)):
    ...

当然,如果你想要在原地排序这个列表,可以用 t.sort(key=operator.itemgetter(0)) 来实现。

撰写回答