2017-01-01 7 views
1

サブ要素の値がクエリに最も近いIntである配列要素のインデックスを返すにはどうすればよいですか。Pythonでもっとも一致する値を含む要素の配列インデックスを返します

例: 配列は次のようになります場合:

{ 
    "data": [ 
     { 
     "time": 1483304400, 
     }, 
     { 
     "time": 1483308000, 
     }, 
     { 
     "time": 1483311600, 
     }, 
     { 
     "time": 1483315200, 
     }, 
     { 
     "time": 1483318800, 
     } 
    ] 
} 

と私のクエリが1483311700で、私はそれが最も一致する要素のインデックスだとして2返すようにしたいです。

+0

このあなたはjsonのように見え、demjsonのようなライブラリを使い、この命令を使ってデコードし、 'demjson.decode(入力が入っている文字列)'とし、それを配列のように見て、forループを使い、計算する期待数に最も近い数字 –

答えて

8

これは、組み込みのmin関数を使用して、'time'キーの値とqueryの値の絶対差を返すカスタムキー関数を使用して行うことができます。

min(it, key=keyfunc)は、keyfuncに従ってitから最小の要素を返します。

>>> index, value = min(enumerate(data), key=lambda x:abs(x[1]['time'] - query)) 
>>> index 
2 
ここ

dataは、あなたの入力で'data'キーの値である:あなたの代わりにitenumerate(it)を使用し、それに応じて、キーの機能を微調整した場合、minは、要素とそのインデックスの両方を返します。

0

リスト内の時間値を分離します。

In [1]: %cpaste 
Pasting code; enter '--' alone on the line to stop or use Ctrl-D. 
:data = { 
: "data": [ 
:  { 
:  "time": 1483304400, 
:  }, 
:  { 
:  "time": 1483308000, 
:  }, 
:  { 
:  "time": 1483311600, 
:  }, 
:  { 
:  "time": 1483315200, 
:  }, 
:  { 
:  "time": 1483318800, 
:  } 
: ] 
:} 
:-- 

In [2]: data["data"] 
Out[2]: 
[{'time': 1483304400}, 
{'time': 1483308000}, 
{'time': 1483311600}, 
{'time': 1483315200}, 
{'time': 1483318800}] 

In [3]: times = [j["time"] for j in data["data"]] 

In [4]: times 
Out[4]: [1483304400, 1483308000, 1483311600, 1483315200, 1483318800] 

次に、リスト項目とクエリの絶対差のリストを生成します。

In [3]: times = [j["time"] for j in data["data"]] 

In [4]: times 
Out[4]: [1483304400, 1483308000, 1483311600, 1483315200, 1483318800] 

In [5]: diff = [abs(j-1483311700) for j in times] 

In [6]: diff 
Out[6]: [7300, 3700, 100, 3500, 7100] 

最後に、最も低い差のインデックスを見つけます。 bisect.bisect(a, x, lo=0, hi=len(a))関数を用い

In [7]: min(diff) 
Out[7]: 100 

In [8]: diff.index(100) 
Out[8]: 2 
関連する問題