我有一个列表字典,我想根据最新日期获取值。
例如:
a = {
"3456" :["031","a","10-09-1988","fff","xxx/xxx","032","b","20-10-1999","sss","yyy/yyyy"],
"5323" :["031","a","10-10-1999","fff","xxx/xxx","032","b","20-10-1988","sss","yyy/yyyy"],
}
上面的词典有2个条目,每个条目有2个日期:
我在下面尝试过这个脚本,但它没有按预期工作
lst = sorted(a , key=lambda x: datetime.strptime(x[2], "%Y-%m-%d"))
new_dict = {( item[4]): item for item in lst}
预期产出:
yyy/yyy
xxx/xxx
答案 0 :(得分:0)
正常循环和条件
day-month-year
,%d-%m-%Y
,并且您以"%Y-%m-%d"
格式签到。<强>演示强>
>>> from datetime import datetime
>>> a
{'3456': ['031', 'a', '10-09-1988', 'fff', 'xxx/xxx', '032', 'b', '20-10-1999', 'sss', 'yyy/yyyy'], '5323': ['031', 'a', '10-10-1999', 'fff', 'xxx/xxx', '032', 'b', '20-10-1988', 'sss', 'yyy/yyyy']}
>>> final_result = []
>>> for key in a:
... if datetime.strptime(a[key][2], "%d-%m-%Y") > datetime.strptime(a[key][7], "%d-%m-%Y"):
... final_result.append(a[key][4])
... else:
... final_result.append(a[key][9])
...
>>> final_result
['yyy/yyyy', 'xxx/xxx']
>>>
答案 1 :(得分:0)
首先,当您在sorted
上使用a
时,您将获得一个字典列表排序键,因为当您遍历字典时,您会遍历键。然后,您尝试使用strptime
作为关键函数,但这不起作用,因为您正在索引"3456"
之类的字符串,因此x[2]
为5
。最后,你尝试制作一个new_dict
,但我不知道你在期待什么,因为词典本质上是无序的。
如果我们可以假设您的列表值的格式始终是相同的,那么您真的不想对列表值进行排序。只需使用以下内容:
In [4]: def extract(x, ts="%d-%m-%Y"):
...: if datetime.strptime(x[2], ts) > datetime.strptime(x[7], ts):
...: return x[4]
...: else:
...: return x[9]
...:
现在你可以使用循环或理解:
In [5]: [extract(lst) for lst in a.values()]
Out[5]: ['xxx/xxx', 'yyy/yyyy']
注意,您无法保证上述顺序,因为词典是无序的。
除非你想迭代排序的密钥:
In [21]: [extract(a[k]) for k in sorted(a) ]
Out[21]: ['yyy/yyyy', 'xxx/xxx']
但目前还不清楚这是不是你想要的。
答案 2 :(得分:0)
建议您先从列表中构建数据,然后比较日期,最后得到结果。
from _datetime import datetime
data = {
"3456": ["031", "a", "10-09-1988", "fff", "xxx/xxx", "032", "b", "20-10-1999", "sss", "yyy/yyyy"],
"5323": ["031", "a", "10-10-1999", "fff", "xxx/xxx", "032", "b", "20-10-1988", "sss", "yyy/yyyy"]
}
obj_elements_num = 5
date_format = '%d-%m-%Y'
def string_to_date_object(date_string):
return datetime.strptime(date_string, date_format)
for a_dict in data:
tmp_date, tmp_value, tmp_len = "01-01-1970", "TMP", 0
while tmp_len < len(data[a_dict]):
_, _, cmp_date, _, value = data[a_dict][tmp_len:tmp_len+obj_elements_num]
if string_to_date_object(cmp_date) > string_to_date_object(tmp_date):
tmp_date, tmp_value = cmp_date, value
tmp_len += obj_elements_num
print(tmp_date, tmp_value)
----------------------------------------------------------------
20-10-1999 yyy/yyyy
10-10-1999 xxx/xxx