如何获取数组或元素中的最新值

时间:2017-04-18 07:14:03

标签: 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-09-1988和20-10-1999 (在这个20-10-1999是最新的所以我需要yyy / yyy值作为ouptut)
  • 5323 - > 10-10-1999和20-10-1988 (在这10-10-1999是最新的,所以我需要xxx / xxx值为ouptut)

我在下面尝试过这个脚本,但它没有按预期工作

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

3 个答案:

答案 0 :(得分:0)

正常循环和条件

  1. 您的日期格式为day-month-year%d-%m-%Y,并且您以"%Y-%m-%d"格式签到。
  2. 使用简单if条件比较两个日期值。
  3. <强>演示

    >>> 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