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
简单地翻转。
这应该有效。
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))
以下作品:
>>> 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
变量,这就是为什么它不会引发错误的原因。但是,如果我运行以下内容:
>>> 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']]
在您的情况下,它可以工作,因为您的日期字符串格式正确。将它们转换为日期时间对象可能仍然是谨慎的。
你必须将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']]