基于日期存在性的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日”
,现在是哪一年?听起来您需要先将值标准化,将字符串更改为日期格式,然后按日期排序。