基于日期存在性的python列表dict排序

基于日期存在性的python列表dict排序,python,dictionary,Python,Dictionary,我的清单如下: 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

我的清单如下:

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)
从日期时间导入日期时间
导入时间
进口稀土
def键(v):
s=v['dt']

s=re.sub(“(?如果您更明确地知道要刮取的日期是如何格式化的,那么答案可能会更清楚一些:

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)
从日期时间导入日期时间
导入时间
进口稀土
def键(v):
s=v['dt']
s=re.sub(“(?以下是针对您的问题的另一个硬编码解决方案:

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'}]
以下是针对您的问题的另一个硬编码解决方案:

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'}]

为什么要在2018年2月20日(即今天)之前对2018年2月1日进行排序?您正在按字母顺序对字符串进行排序,请将字符串转换为某种日期格式,以便能够对其进行排序。当您有
“12月1日”
时,现在是哪一年?当前?听起来您需要先将值标准化,将字符串更改为日期格式,然后按日期排序。为什么
“2018年2月1日”
在“2月20日”之前排序(即今天)?要按字母顺序对字符串进行排序,请将字符串转换为某种日期格式,以便能够对其进行排序。当您有
“12月1日”
,现在是哪一年?听起来您需要先将值标准化,将字符串更改为日期格式,然后按日期排序。