import csv,operator
from datetime import datetime
li = [['name','01/03/2012','job'],
['name','02/05/2013','job'],
['name','03/08/2014','job']]
sorted(li,key=lambda x:datetime.strptime(row[1],'%d/%m/%Y'), reverse=True)
输出:
没有错误,但根本没有订购
for x in range(1,len(li)):
li[x][6]=datetime.strptime(li[x][6],'%d/%m/%Y')
li.sort(key=operator.itemgetter(6))
输出:
Traceback (most recent call last):
File "U:/rmarshall/Work For Staff/ROB/_Python/__Python Projects Code/April Signed Terms.py", line 35, in <module>
li.sort(key=operator.itemgetter(6))
TypeError: unorderable types: datetime.datetime() < str()
有人可以提供按日期排序列表的示例。出于教育目的,我将欣赏排序方法和itemgetter方法的示例,并比较效率。
此外,由于itemgetter方法的错误,itemgetter根本无法处理日期时间对象。
注意:我认为在这个例子中升序或降序并不重要,因为它可以简单地用reverse=True
翻转。
答案 0 :(得分:3)
这应该有用。
print(sorted(li, key=lambda x: datetime.strptime(x[1], '%d/%m/%Y'), reverse=True))
您在lamba中使用了row
,这可能是之前定义的,但永远不会改变。
我在这里找不到使用itemgetter
的方法。说实话,有办法,但看起来并不好。
key_function = lambda x: datetime.strptime(itemgetter(1)(x), '%d/%m/%Y')
print(sorted(li, key=key_function, reverse=True))
答案 1 :(得分:3)
以下作品:
>>> sorted(li, key=lambda x: datetime.strptime(x[1], "%d/%m/%Y"), reverse=True)
[['name', '03/08/2014', 'job'], ['name', '02/05/2013', 'job'], ['name', '01/03/2
012', 'job']]
使用sorted()
时出现的问题是,您尝试从row[1]
创建一个不起作用的日期时间。将其更改为您创建的lambda
,如上所示。
您很可能在之前的某处定义了row
变量,这就是为什么它不会引发错误的原因。但是,如果 I 运行以下内容:
>>> sorted(li,key=lambda x:datetime.strptime(row[1],'%d/%m/%Y'), reverse=True)
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 1, in <lambda>
NameError: global name 'row' is not defined
以下是itemgetter
的示例:
>>> sorted(l, key=itemgetter(1))
[['name', '01/03/2012', 'job'], ['name', '02/05/2013', 'job'], ['name', '03/08/2014', 'job']]
在您的情况下,它有效,因为您的日期字符串格式正确。将它们转换为datetime对象可能仍然是谨慎的。
答案 2 :(得分:2)
您必须将str
转换为datetime
,因为sorted
无法与datetime
和str
进行比较。
datetime.strptime用于将str
转换为datetime
对象。
您可以使用list.sort
对相同列表进行排序。
In [43]: li.sort(key=lambda x: datetime.strptime(x[1], "%d/%m/%Y"))
In [44]: li
Out[44]:
[['name', '01/03/2012', 'job'],
['name', '02/05/2013', 'job'],
['name', '03/08/2014', 'job']]