按日期排序元组列表
我想要对一个元组中的一部分进行排序,并按照日期返回这部分内容。
我只想对第一个到第四个记录(也就是元组的前四个元素)进行排序,然后打印出来。
tuple = [('Dec 1, 2010', '7.41', '7.60', '7.37'),
('Dec 4, 2010', '7.41', '7.60', '7.37'),
('Dec 2, 2010', '7.41', '7.60', '7.37'),
('Dec 20, 2010', '7.41', '7.60', '7.37'),
('Dec 16, 2010', '7.41', '7.60', '7.37'),
('Jan 2, 2011', '7.41', '7.60', '7.37')]
我试过这样做:
import operator
sorted(tuple[:3], key=operator.itemgetter('date'), reverse=True)
但是,出现了一个错误:“TypeError: 元组的索引必须是整数,而不能是字符串。”
4 个回答
0
问题在于你在找的键是 'date'
。这只有在数据元素是包含 'date'
的字典时才有效。
正如tokland所指出的,你需要使用 0
,因为你要获取的是元组中的第一个元素。
另外,确保不要把你的 tuple
命名为“tuple”:这是类型本身的名称,你不想用其他值来替代它。
1
首先,[]
不是元组,它叫做列表(你可以看看 daniweb.com上的这篇帖子)。
其次,在一个 字典
中,你是把一个 键
和一个 值
关联起来的。因为列表是一维的,所以你只能通过索引来获取一个值。
>> dic = {'date' : 'value', 'bla' : 'foo'}
>> dic['date']
value
>> dic['bla']
foo
>> list = ['a', 'b', 'c']
>> list[0]
a
>> list[2]
c
你很可能想在排序之前把你的日期转换成 datetime.datetime
对象。因为在你的例子中,它们是字符串,所以它们会按字母顺序排序,而不是按日期排序。
8
你为什么要用 date
来获取呢?难道你想要的不是元组里的第一个元素吗?
sorted(records[:3], key=operator.itemgetter(0), reverse=True)
顺便说一下,在比较日期之前,你应该先把字符串转换成真正的日期。也许可以这样做:
from datetime import datetime
def get_date(record):
return datetime.strptime(record[0], "%b %d, %Y")
sorted(records[:3], key=get_date, reverse=True)
我把 tuple
改名为 records
。正如其他人提到的,使用 tuple
会遮蔽一个类型构造器;同样重要的是:这是一个列表而不是元组,变量名应该用复数形式(因为它存储的是一个集合),而且应该有个有意义的名字。