返回包含Python中最接近匹配值的元素的数组索引

时间:2017-01-01 22:38:22

标签: python arrays

如何返回其子元素值与我的查询最接近的Int匹配的数组元素的索引。

例如: 如果数组看起来像这样:

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

我的查询为1483311700,然后我想返回2,因为它是最接近的匹配元素的索引。

3 个答案:

答案 0 :(得分:8)

这可以使用内置的min函数和自定义键函数来完成,该函数返回'time'键和query的值之间的绝对差值。

min(it, key=keyfunc)根据it返回keyfunc中的最小元素。如果您使用enumerate(it)代替it并相应地调整键函数,min将返回元素及其索引:

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

此处data是输入中'data'键的值。

答案 1 :(得分:1)

使用bisect.bisect(a, x, lo=0, hi=len(a))函数的简单解决方案(返回插入点,该插入点位于。中x的任何现有条目之后(右侧):

idx = bisect.bisect([d['time'] for d in data], 1483311700) - 1
print(idx)  # 2

https://docs.python.org/3/library/bisect.html#module-bisect

答案 2 :(得分: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]

最后,找到最低差异的索引。

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

In [8]: diff.index(100)
Out[8]: 2