按格式化为字符串的键对python字典进行排序

时间:2012-10-10 13:50:32

标签: python sorting dictionary

我有一个字典,其字符串为格式为yyyy-mm-dd的键,并且希望按最早的日期按键对字典进行排序:

我目前正在使用sorted(datesAndText.keys()),但由于月份和日期字段并非始终为零填充,因此无法正常工作。

我查看了Sort python dictionary by date keysHow do I sort this list in Python, if my date is in a String?,但我似乎无法通过具体案例采纳它们。

3 个答案:

答案 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