2017-04-19 6 views
0

私はdatetimeオブジェクトtarget_timeを持っています。また、times_list[i]['time']がdatetimeオブジェクトであるようなリストもあります。私はこのリストを反復して、target_timeから最小の時間距離を持つアイテムのインデックスを探したいと思います。これらの違いはミリ秒のオーダーであり、リストに記載されている時間の範囲は数分のオーダーになります。私の現在のソリューションは、かなり不格好です:Pythonの方法では、リストからターゲットまでの時間差が最も小さい日時を見つけることができますか?

best_index = -1 
best_diff = 999999999999.0 
for i in range(len(times_List)): 
    cur_time = times_list[i]['time'] 
    diff = abs((cur_time-target_time).total_seconds())) 
    if diff < best_diff: 
     best_index = i 
     best_diff = diff 
if best_index > -1: 
    result = times_list[best_index]['time'] 

は、これを行うの少ない不格好、より神託方法はありますか?

+0

サンプルデータ構造と、これらのサンプルの望ましい出力を教えてください。 – timgeb

答えて

3
import operator 
deltas = [abs(ti['time'] - target_time) for ti in times_list] 
min_index, min_delta = min(enumerate(deltas), key=operator.itemgetter(1)) 
0

代替方法:

temp = sorted(times_list, key=lambda x: abs(abs((x-target_time).total_seconds()))) 
result = times_list.index(temp[0]) 
+0

私はこれがインポートを必要としないのが好きです。 –

+0

なぜ私はリストの理解の上でラムダを好むのか理解できません。 – guidot

+0

この方法は他の方法より効率が悪いです。 'sort()'はO(n log n)_plus_です。アイテムを探すためにリストを再スキャンする必要があります。 'min()'を使う他の解法はO(n)です。 – mhawke

0

機能に最も近いを見つけるために:

from datetime import datetime 

def closest(target, dates):  
    return min(dates, key=lambda date: abs(date-target)) 


print(closest(target1, dates)) 
#2014-12-31 16:00:00 

print(closest(target2, dates)) 
#2015-01-01 12:00:00 
print(abs(target1 - target2)) 
+0

OPでも最小のデルタを持つアイテムのインデックスが必要です。 – mhawke

1

は、最小の違いを見つけるために、min()を使用してください。 enumerate()と指標を追跡するためにすることを組み合わせる:

min_pos, min_diff = min(enumerate(times_list), key=lambda t: abs(target_time - t[1]['time'])) 

違いの中間リストを生成する必要はありません。

+0

't [i]'はループ変数であるので、 't [1]'はエラーです。 –

+0

@HalTLいいえ、1はcorectです。これは、ラムダ式に渡されたタプルの2番目の項目です。ループ変数はありません。 – mhawke

関連する問題