[英]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'}]
元素应按以下顺序排序:
'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.