繁体   English   中英

根据第一项对元组列表进行排序

[英]Sorting a list of tuples based on the first items

如何根据第一个值对元组列表进行排序,即在字典中我们可以使用sorted(a.keys())

如何为元组列表执行此操作?

如果这些是元组值

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

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

通常,仅sorted(t)有效,因为元组按字典顺序排序 如果您真的想忽略第一项之后的所有内容(而不是按以下元素对具有相同第一个元素的元组进行排序),您可以提供一个key来挑选第一个元素。 最简单的方法是operator.itemgetter

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

当然,如果您想就地对列表进行排序,则可以使用t.sort(key=operator.itemgetter(0))代替。

或者你可以使用这样的东西来确保按日期排序的元组列表:

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' 是 year- month- day ,你可以:

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 ,这些tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst可通过常见的点符号访问(例如 toto.tm_mon )访问,但也可通过索引[符号访问( ]例如),因为struc_time对象的属性按tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst struct_time数据类型有一个命名元组的 interface

由于struct_time对象是自然排序的,因此没有必要应用strftime()来获取按此顺序具有year-month-day的日期字符串:该顺序已存在于struct_time对象中。

然后,我纠正我的代码,其中11“2010-06- 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

您可以使用非常简单的

t.sort()

请参阅: Python 如何对元组列表进行排序?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM