【问题标题】:Order list by date (String and datetime)按日期排序列表(字符串和日期时间)
【发布时间】:2014-04-04 09:57:26
【问题描述】:
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)

输出:

没有错误,只是没有排序

Itemgetter 方法:

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()

谁能提供一个按日期排序列表 li 的示例。出于教育目的,我将欣赏 sorted 方法和 itemgetter 方法的示例以及效率比较。

此外,由于 itemgetter 方法的错误,itemgetter 根本无法处理 datetime 对象。

注意:我认为在这个例子中升序或降序并不重要,因为它可以简单地用reverse=True翻转。

【问题讨论】:

    标签: python string sorting datetime


    【解决方案1】:

    这应该可行。

    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))
    

    【讨论】:

      【解决方案2】:

      以下作品:

      >>> 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']]
      

      在您的情况下它可以工作,因为您的日期字符串格式正确。将它们转换为日期时间对象可能仍然是谨慎的。

      【讨论】:

        【解决方案3】:

        您必须将str 转换为datetime,因为sorted 无法比较datetimestr

        datetime.strptime 用于将str 转换为datetime 对象。

        您可以使用list.sort on 对同一列表进行排序。

        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']]
        

        【讨论】:

          猜你喜欢
          • 2019-01-05
          • 1970-01-01
          • 1970-01-01
          • 2016-08-09
          • 1970-01-01
          • 2018-02-19
          • 1970-01-01
          • 2018-07-07
          • 2012-11-24
          相关资源
          最近更新 更多