我有一个字典,其字符串为格式为yyyy-mm-dd的键,并且希望按最早的日期按键对字典进行排序:
我目前正在使用sorted(datesAndText.keys())
,但由于月份和日期字段并非始终为零填充,因此无法正常工作。
我查看了Sort python dictionary by date keys和How do I sort this list in Python, if my date is in a String?,但我似乎无法通过具体案例采纳它们。
答案 0 :(得分:8)
您确定您的密钥完全采用yyyy-mm-dd
格式吗?例如:
>>> '2010-1-15' < '2010-02-15'
False
您可能被迫对此进行排序:
sorted(d,key=lambda x: [int(y) for y in x.split('-')])
另一种解决方案(假设您的年份都是4位数字):
sorted(d,key=lambda x: [y.zfill(2) for y in x.split('-')])
我不确定哪个更快。我想这是timeit
的候选人。
答案 1 :(得分:2)
yyyy-mm-dd
格式的日期按字母顺序和按时间顺序排序相同,因此您可以使用标准sorted
:
for k, v in sorted(datesAndText.items()):
# do something with key and value
答案 2 :(得分:2)
您的格式yyyy-mm-dd
允许使用字典排序,因此您的代码应该可以正常工作,除非您的值不是零填充(仅2012-10-9
而不是2012-10-09
)。
依靠比较日期而不是字符串来解决此问题:
sorted(datesAndText, key=lambda x: datetime.strptime(x, '%Y-%m-%d'))
这利用key
参数进行排序,这是一个接受一个参数(在排序期间进行比较的列表元素)的函数,并返回sorted
可用于排序的值。
如果您的数据需要更改,这有一个附带的好处,即允许您明确specify the string format日期。
编辑:
mgilson提出了一个有趣的观点。 str.split
可能更有效率。让我们看看他是否正确:
strptime
解决方案:
bburns@virgil:~$ python -mtimeit -s"from datetime import datetime;d={'2012-2-12':None, '2012-10-9':None, '1978-1-1':None, '1985-10-9':None}" 'sorted(d, key=lambda x: datetime.strptime(x,"%Y-%m-%d"))'
10000 loops, best of 3: 79.7 usec per loop
mgilson's原始str.split
解决方案:
bburns@virgil:~$ python -mtimeit -s"from datetime import datetime;d={'2012-2-12':None, '2012-10-9':None, '1978-1-1':None, '1985-10-9':None}" 'sorted(d,key=lambda x: [int(y) for y in x.split("-")])'
100000 loops, best of 3: 17.6 usec per loop
mgilson's zfill
str.split
解决方案:
bburns@virgil:~$ python -mtimeit -s"from datetime import datetime;d={'2012-2-12':None, '2012-10-9':None, '1978-1-1':None, '1985-10-9':None}" 'sorted(d,key=lambda x: [y.zfill(2) for y in x.split("-")])'
100000 loops, best of 3: 7.4 usec per loop
看起来他是对的! mgilson's原始答案速度提高了4-5倍,他的最终答案速度提高了10-11倍!但是,正如我们在评论中所同意的那样,可读性至关重要。除非你目前受CPU限制,否则我仍然建议datetime.strptime
超过str.split
。