如何按表示为字符串的日期时间正确地对字典排序?

时间:2018-06-19 22:11:53

标签: python datetime

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)

1 个答案:

答案 0 :(得分:2)

字符串只是按字母顺序排序,因此,05-24-2015当然在04-24-2018之后,如您所知。

(这是很多软件使用YYYY-MM-DD日期格式的原因:可以仅按字母顺序对其进行排序就可以了。)

要按日期顺序对它们进行排序,您需要将字符串解析为日期对象。由于日期和时间格式太多,因此您必须具体说明使用的是哪种格式。 strptime函数是最简单的方法(没有dateutil这样的第三方库,有时可能会更容易)。

此外,您不能只使用k['time_start']作为键功能;您需要一个具有k值并为其返回相应排序键的 function 。您可以使用lambda内联完成此操作,但是我认为使用离线def会更容易理解。

另外,time_startstart_time不是相同的字符串,并且在Python 3.x中排序函数的key参数仅是关键字。

所以:

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方法,而不是构建排序后的副本,然后将其分配回相同的变量。