![](/img/trans.png)
[英]Sorting a list of list of tuples based on the sum of first field in the tuple in Python
[英]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')]
.
阅读 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
考虑到 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.