python - 如何按表示为字符串的日期时间正确排序字典?
问题描述
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)
解决方案
字符串只是按字母顺序排序,所以当然05-24-2015
在 之后04-24-2018
,正如您似乎已经理解的那样。
(这是许多软件使用YYYY-MM-DD
日期格式的原因之一:然后您可以按字母顺序对它们进行排序,它就可以工作。)
要按日期顺序对它们进行排序,您需要将字符串解析为日期对象。因为有很多不同的日期和时间格式,所以您必须具体说明您使用的是哪一种。该strptime
函数是最简单的方法(没有第三方库,例如dateutil
,有时可以使其更容易)。
此外,您不能只k['time_start']
用作键功能;您需要一个函数,该函数接受一个k
值并为其返回相应的排序键。您可以使用 内联来做到这一点lambda
,但我认为使用外联会更容易理解def
。
此外,time_start
andstart_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
方法,而不是构建一个排序的副本,然后将它分配回同一个变量。
推荐阅读
- c++ - A类中的B类继承A类
- python - (-212:Parsing error) 使用 yolo、google colab 和 opencv 进行对象检测
- javascript - 使用 Fabric JS 定义标记线
- sql - SQL 在 2 个单独的列中从 2 个单独的行中减去一个值
- ruby-on-rails - Rails 验证错误消息删除键
- google-cloud-endpoints - 如何在服务器端运行可以通过 Google Cloud Endpoints 创建新文件的按需脚本?
- report - Cognos 结果按 day_of_week/工作日
- python - 在 Python 中进行人脸识别的 Face Anti-Spoofing 方法
- json - 使用 Alamofire 在多形式 Swift 的参数中附加嵌套对象
- java - 如何将方法内部的字符串数组传递给另一个方法?