我有一个具有属性名称和DOB(出生日期)的人物对象列表
[{'name':'robert', 'DOB':'1991-12-17'},
{'name':'Alex', 'DOB':'1995-1-31'},
{'name':'Julia','DOB':'1993-4-20'},
{'name':'sevak', 'DOB':'1991-12-17'},
{'name':'feb', 'DOB':'1991-03-07'}]
注意:DOB仅为字符串格式。
我正在尝试根据当前日期最近即将到来的生日在python中对此列表进行排序。
我的预期输出:
如果当前日期为2017-05-21,则输出应如下:
[{'name':'robert', 'DOB':'1991-12-17'},
{'name':'sevak', 'DOB':'1991-12-18'},
{'name':'Alex', 'DOB':'1995-1-31'},
{'name':'feb', 'DOB':'1991-03-07'},
{'name':'Julia','DOB':'1993-4-20'}]
如果当前日期是2017-03-14,则输出应如下:
[{'name':'Julia','DOB':'1993-4-20'},
{'name':'robert', 'DOB':'1991-12-17'},
{'name':'sevak', 'DOB':'1991-12-18'},
{'name':'Alex', 'DOB':'1995-1-31'},
{'name':'feb', 'DOB':'1991-03-07'}]
注意:忽略这个排序的年份我需要根据最近即将到来的即将到来的生日进行排序
这是我到目前为止所尝试的:
for each_patient in patientlist:
globaldata.patients_records[str(each_patient['id'])] = each_patient;
x = each_patient['date_of_birth'];
if not x == None:
x = add_months(datetime.datetime(*[int(item) for item in x.split('-')]), 1).strftime("%Y-%m-%d");
print x;
each_patient['date_of_birth'] = x;
patients.append(each_patient);
patients_url = data['next'];
patients.sort(key=lambda ep: ep['date_of_birth']);
先谢谢你们..
答案 0 :(得分:2)
您可以将这些字符串转换为datetime
个对象,然后使用sorted()
按今天日期的日期排序:
l = [{'name': 'robert', 'DOB': '1991-12-17'},
{'name': 'Alex', 'DOB': '1995-1-31'},
{'name': 'Julia', 'DOB': '1993-4-20'},
{'name': 'sevak', 'DOB': '1991-12-17'},
{'name': 'feb', 'DOB': '1991-03-07'}]
from datetime import datetime as dt
now = dt.strptime("2017-03-14", '%Y-%m-%d')
# now=dt.now()
sorted(l, key=lambda x: (dt.strptime(str(now.year + 1) + x["DOB"][4:], '%Y-%m-%d') - now).days % 365)
结果:
[{'DOB': '1993-4-20', 'name': 'Julia'},
{'DOB': '1991-12-17', 'name': 'robert'},
{'DOB': '1991-12-17', 'name': 'sevak'},
{'DOB': '1995-1-31', 'name': 'Alex'},
{'DOB': '1991-03-07', 'name': 'feb'}]