繁体   English   中英

python list dict基于日期存在的排序

[英]python list dict sorting based on date existence

我有一个如下列表:

lst = [{'dt': u'Dec 22, 2017'}, {'dt': u'Dec 14, 2017'}, {'dt': u'Dec 12, 2017'}, {'dt': u'NA'}, {'dt': u'December 1st'}, {'dt': u'Feb 1, 2018'}, {'dt': u'January 31'}, {'dt': u'Oct 31, 2017'}, {'dt': u'July 11'}, {'dt': u'Jan 22, 2018'},{'dt': u'Thursday'}]

lst.sort(key=lambda item:item['dt'], reverse=True)
print lst

[{'dt': u'Thursday'}, {'dt': u'Oct 31, 2017'}, {'dt': u'NA'}, {'dt': u'July 11'}, {'dt': u'January 31'}, {'dt': u'Jan 22, 2018'}, {'dt': u'Feb 1, 2018'}, {'dt': u'December 1st'}, {'dt': u'Dec 22, 2017'}, {'dt': u'Dec 14, 2017'}, {'dt': u'Dec 12, 2017'}]

但是我的输出应该如下所示。

[{'dt': u'Feb 1, 2018'},{'dt': u'Jan 22, 2018'},{'dt': u'Dec 22, 2017'}, {'dt': u'Dec 14, 2017'}, {'dt': u'Dec 12, 2017'},{'dt': u'Oct 31, 2017'},{'dt': u'December 1st'},{'dt': u'July 11'}, {'dt': u'January 31'},{'dt': u'Thursday'},{'dt': u'NA'}]

元素应按以下顺序排序:

  • 年的第一个字符串(现在到过去)
  • 然后只有 (12月至1月)的用户
  • 然后用'NA'

如果您更明确地知道要抓取的日期的格式,则可以稍微清理一下答案:

from datetime import datetime
import time
import re


def key(v):
    s = v['dt']
    s = re.sub('(?<=1)st|(?<=2)nd|(?<=3)rd|(?<=[04-9])th', '', s)

    try:
        dt = datetime.strptime(s, '%b %d, %Y')
        return time.mktime(dt.timetuple())+1, 0, 0
    except ValueError:
        pass

    try:
        dt = datetime.strptime(s, '%B %d')
        return 0, dt.timetuple().tm_yday+1, 0
    except ValueError:
        pass

    try:
        i = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'].index(s)
        return 0, 0, i+1
    except ValueError:
        pass

    return 0, 0, 0


lst = [{'dt': u'Dec 22, 2017'}, {'dt': u'Dec 14, 2017'}, {'dt': u'Dec 12, 2017'}, {'dt': u'NA'}, {'dt': u'December 1st'}, {'dt': u'Feb 1, 2018'}, {'dt': u'January 31'}, {'dt': u'Oct 31, 2017'}, {'dt': u'July 11'}, {'dt': u'Jan 22, 2018'},{'dt': u'Thursday'}]
lst.sort(key=key, reverse=True)

这是解决您问题的另一种硬编码解决方案:

from datetime import datetime
import calendar
import re

def datesort(item):
    item = re.sub('st|nd|rd|th', '', item['dt'])
    try:
        return datetime.strptime(item, '%b %d, %Y')
    except ValueError:
        try:
            return datetime.strptime(item + ', 1903', '%b %d, %Y')
        except ValueError:
            try:
                return datetime.strptime(item + ', 1903', '%B %d, %Y')
            except ValueError:
                try:
                    return datetime(1902, 1, list(calendar.day_name).index(item) + 1)
                except ValueError:
                    return datetime(1901,1,1)

lst = [{'dt': u'Dec 22, 2017'}, {'dt': u'Dec 14, 2017'}, {'dt': u'Dec 12, 2017'}, {'dt': u'NA'}, {'dt': u'December 1st'}, {'dt': u'Feb 1, 2018'}, {'dt': u'January 31'}, {'dt': u'Oct 31, 2017'}, {'dt': u'July 11'}, {'dt': u'Jan 22, 2018'},{'dt': u'Thursday'}]

sorted(lst, key=datesort, reverse=True)
#[{'dt': u'Feb 1, 2018'},{'dt': u'Jan 22, 2018'},{'dt': u'Dec 22, 2017'}, {'dt': u'Dec 14, 2017'}, {'dt': u'Dec 12, 2017'},{'dt': u'Oct 31, 2017'},{'dt': u'December 1st'},{'dt': u'July 11'}, {'dt': u'January 31'},{'dt': u'Thursday'},{'dt': u'NA'}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM