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”
    格式
  • 使用简单if条件比较两个日期值
  • 演示

    >>> 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的结构吗医生?