2017-04-18 42 views
-1

我有一個列表字典,我想根據最新日期獲取值。如何獲取數組或元素的最新值

例如:

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 - > 1988年10月9日和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 
+1

首先嚐試通過'for循環'和'if condition'獲得預期輸出,然後使用advance方法。 –

+0

'yyy/yyy'或者'xxx/xxx'來自大日期值的兩個索引後的列表 –

+0

它是數組的元素,您可以在這裏看到[「031」,「a」,「10-09-1988」 ,「fff」,「xxx/xxx」, – Mounarajan

回答

0

通過正常的循環,如果條件

  1. 日期格式爲day-month-year%d-%m-%Y,您正在檢查"%Y-%m-%d"格式。
  2. 使用簡單條件來比較兩個日期值。

演示

>>> 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'] 
>>> 
+0

您假設[key] [4]和[鍵] [9],但認爲陣列將有更多的元素,我怎麼能自動化它? – Mounarajan

+0

我給出了硬編碼值(你給出的輸入)的解決方案。現在你可以根據你的輸入修改代碼。 –

0

首先,當您使用asorted你得到的字典排序鍵的列表,因爲當你遍歷你遍歷鍵的字典。然後,您嘗試使用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'] 

但目前還不清楚,如果這是你想要的。

+0

你假設一個[鍵] [4]和一個[鍵] [9],但認爲該陣列將有更多的元素,我怎麼能自動化它? – Mounarajan

+0

@Mounarajan它是一個*列表*,而不是一個數組。但是你有任何控制權嗎?這是數據結構的糟糕選擇。你原來的帖子暗示這些列表會有這種形式,但你的意思是它可能有更多的元素?你知道任何關於列表結構的東西嗎? –

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 
相關問題