如何返回其子元素值与我的查询最接近的Int匹配的数组元素的索引。
例如: 如果数组看起来像这样:
{
"data": [
{
"time": 1483304400,
},
{
"time": 1483308000,
},
{
"time": 1483311600,
},
{
"time": 1483315200,
},
{
"time": 1483318800,
}
]
}
我的查询为1483311700
,然后我想返回2
,因为它是最接近的匹配元素的索引。
答案 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
答案 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