2017-04-18 20 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は最新ですので、yuy/yyy値が必要です)
  • 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 loop'と' if condition'で予期した出力を得ようとすると、advanceメソッドを使います。 –

+0

'yyy/yyy'または' xxx/xxx'は、より大きな日付値の2つのインデックスの後のリストからのものです –

+0

配列の要素です。ここで見ることができます["031"、 "a"、 "10-09-1988" 、 "fff"、 "xxx/xxx"、 – Mounarajan

答えて

0

ループのための正常なことでとIF条件

  1. あなたの日付形式はday-month-yearですすなわち%d-%m-%Yで、"%Y-%m-%d"の形式でチェックインします。
  2. 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 
関連する問題