Python 如何获取数组或元素中的最新值
我有一个列表字典,我想根据最新日期获取值 例如:Python 如何获取数组或元素中的最新值,python,dictionary,Python,Dictionary,我有一个列表字典,我想根据最新日期获取值 例如: 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个日期: 32456->10-
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个日期:
- 32456->10-09-1988和20-10-1999(在这个例子中,20-10-1999是最新的,所以我需要yyy/yyy值作为输出)
- 5323->10-10-1999和20-10-1988(在这个10-10-1999是最新的,所以我需要xxx/xxx值作为输出)
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
通过正常for循环和if条件
日-月-年
,即%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']
>>>
首先,当您在
a
上使用sorted
时,您会得到一个字典排序键列表,因为当您迭代字典时,您会迭代这些键。然后,您尝试使用strtime
作为键函数,但这不起作用,因为您正在对字符串进行索引,如“3456”
,因此x[2]
是5
。最后,您尝试创建一个新的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']
但不清楚这是否是您想要的。建议您先从列表中构造数据,然后比较日期,最后得到结果
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
from\u datetime导入datetime
数据={
“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”]
}
对象元素数量=5
日期\格式=“%d-%m-%Y”
定义字符串到日期对象(日期字符串):
返回datetime.strTime(日期字符串,日期格式)
对于输入的数据:
tmp_日期,tmp_值,tmp_len=“01-01-1970”,“tmp”,0
而tmp_len字符串\u到\u日期\u对象(tmp\u日期):
tmp_日期,tmp_值=cmp_日期,值
tmp_len+=对象元素数
打印(tmp_日期、tmp_值)
----------------------------------------------------------------
20-10-1999年yyy/yyyy
1999年10月10日xxx/xxx
首先尝试通过for loop
和if condition
获得预期的输出,然后使用advance方法。yyy/yyy
或xxx/xxx
是在两个日期值较大的索引之后的列表。它是数组的元素,您可以在这里看到它[“031”、“a”、“10-09-1988”、“fff”、“xxx/xxx”,@Kasramvd yyy/yyy或xxx/xxx是数组元素的一部分,例如,它是每个日期后的2元素。您假设一个[key][4]和一个[key][9],但认为数组将有更多的元素。我如何使其自动化?我给出了硬代码值(u给定的输入)的解决方案。现在您可以根据您的输入修改代码。您假设一个[key][4]和一个[key][9]但是你认为数组会有更多的元素吗?我怎样才能使它自动化?@Mounarajan它是一个列表,而不是一个数组。但是你能控制它吗?这是一个糟糕的数据结构选择。你最初的帖子暗示这些列表会有这种形式,但是你说它可以有更多的元素是什么意思?你知道l的结构吗医生?