首页 > 解决方案 > 如何按表示为字符串的日期时间正确排序字典?

问题描述

list =
[{'name':'test1', 'start_time': '05-24-2015, 05:47 PM'},
{'name':'test2', 'start_time': '04-24-2018, 02:23 PM'},
{'name':'test3', 'start_time': '06-23-2018, 01:41 PM'}]

我想按开始时间对字典的顺序进行排序,但开始时间是一个字符串。我不确定这是否是最好的方法。

我已经尝试过下面这个可行的解决方案,但忽略了有意义的年份。我猜我需要在排序之前删除破折号、空格和逗号?

list = sorted(list, k['time_start'], reverse=True)

标签: pythondatetime

解决方案


字符串只是按字母顺序排序,所以当然05-24-2015在 之后04-24-2018,正如您似乎已经理解的那样。

(这是许多软件使用YYYY-MM-DD日期格式的原因之一:然后您可以按字母顺序对它们进行排序,它就可以工作。)

要按日期顺序对它们进行排序,您需要将字符串解析为日期对象。因为有很多不同的日期和时间格式,所以您必须具体说明您使用的是哪一种。该strptime函数是最简单的方法(没有第三方库,例如dateutil,有时可以使其更容易)。

此外,您不能只k['time_start']用作键功能;您需要一个函数,该函数接受一个k值并为其返回相应的排序键。您可以使用 内联来做到这一点lambda,但我认为使用外联会更容易理解def

此外,time_startandstart_time不是同一个字符串,key排序函数的参数在 Python 3.x 中仅是关键字。

所以:

import datetime

def our_key(d):
    return datetime.datetime.strptime(d['start_time'], '%m-%d-%Y, %I:%M %p')

现在:

list = sorted(list, key=our_key, reverse=True)

当我们在做的时候,还有几件事:

  • 不要说出你的名单list。那是类型的名称,如果您以后需要执行诸如将元组转换为列表之类的操作,则错误消息会令人困惑。
  • 如果你想对一个列表进行就地排序,你可以调用它的sort方法,而不是构建一个排序的副本,然后将它分配回同一个变量。

推荐阅读