我只想将第一个到第四个记录(元组[:3])排序并打印出来。
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:元组索引必须是整数,而不是str。
答案 0 :(得分:7)
为什么到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
,你正在影响一个类型构造函数;同样重要的是:它是一个列表而不是元组,变量应该是复数(因为它存储了一个集合),它应该有一个有意义的名称。
答案 1 :(得分:1)
首先,[]
不是元组,它被称为列表(参见this post on daniweb.com)。
其次,在dictionary
中,您将key
与value
相关联。由于列表是一维的,因此您只能通过请求indice来获取值。
>> dic = {'date' : 'value', 'bla' : 'foo'}
>> dic['date']
value
>> dic['bla']
foo
>> list = ['a', 'b', 'c']
>> list[0]
a
>> list[2]
c
您最有可能希望在排序之前将日期转换为datetime.datetime
个对象。由于它们是字符串(在您的示例中),它们将按字母顺序排序而不是按日期排序。
答案 2 :(得分:0)
问题在于您要求输入密钥'date'
。只有当数据元素是包含'date'
的字典时,这才有效。
正如tokland指出的那样,你需要使用0
因为那是你要求的元组元素,第一个元素。
另外,请确保不要实际命名tuple
“元组”:这是类型本身的名称,并且您不希望将其替换为其他值。
答案 3 :(得分:0)
文字'date'
并不神奇。 operator.itemgetter
使用它传递的任何内容作为索引,无论它在看什么。它并不试图理解'date'
的含义。
'date'
是一个字符串。 dict
的键是字符串。您的列表中有tuple
个。 tuple
的键是整数,从0开始。
此外,使用key
进行排序只是说“一旦你从每个项目中获得了密钥,就可以根据键值对项目进行排序,正常解释键值”。每个tuple
s的开头项目并不是神奇的某种Date对象,因为它们看起来像是你和我的日期。它们是字符串,它们将像字符串一样进行比较。
@tokland展示了如何为操作设置代码“给定其中一个元组,使用datetime
模块获取start元素并将其转换为日期”。然后他使用此操作为键调用排序。