python - 如何在范围列表中查找数字并返回索引
问题描述
对于此列表:
ranges = [[0,100],[100,200],[200,300]]
如何以python方式设计函数getIndex()
来做到这一点:</p>
getIndex(ranges, 23) --> 0 23 is in the 1st range
getIndex(ranges, 100) --> 1 100 is in the 2nd range
getIndex(ranges, 188) --> 1 188 is in the 2nd range
getIndex(ranges, 223) --> 2 223 is in the 3rd range
getIndex(ranges, 999) --> -1 Not found
这个问题可能已经回答了,但我找不到。
解决方案
这是一个没有任何循环的棘手方法。
def getIndex(ranges, val):
r = np.where(((ranges-val).prod(axis=1)<0) + (ranges[:,0]==val))[0]
return r[0] if len(r)!=0 else -1
我现在将这个水星定理开玩笑地称为:对于r
由 定义的任何范围(r_start, r_end)
,如果任何数字n
落在该范围内,那么(r_start-n)
和(r_end-n)
将有相反的符号!当然,除非n
等于r_start
,否则会导致非负 0。(n=r_end
超出范围)
从范围中减去 val 并在列轴上取乘积,基本上是在做(r_start-n)*(r_end-n)
. 这应该是负数,除了边界情况,我们用 if 做 OR (+) r_starts == n
。然后我们只需在结果布尔数组上调用 np.where 。如果该值不存在,则返回 -1。
ranges = np.array([[0,100],[100,200],[200,300]])
values = [23, 100, 188, 223, 999]
for v in values:
idx = getIndex(ranges,v)
print('{} in ({},{})'.format(v,ranges[idx,0],ranges[idx,1]) if idx!=-1 else '{} not found'.format(v))
23 in (0,100)
100 in (100,200)
188 in (100,200)
223 in (200,300)
999 not found
推荐阅读
- django - 为什么我会收到名称错误?'未定义AuthorAdmin
- go - Go 整数数据竞赛
- java - 如何在 Java 中将日期时间字符串转换为 UTC?
- karate - 空手道机器人没有在“* print robot.allWindows”打印的列表中列出我的应用程序,该列表仅由脚本分叉
- java - 每次迭代后停止第一个线程,以便第二个线程可以产生生成的随机数的阶乘
- java - 是什么导致了这个错误“Evaluator.java:6: error: cannot find symbol import org.antlr.v4.runtime.CharStreams;”?
- ansible - 在 Ansible 中,当这些不需要的属性未在配置中定义时,如何获取 json 模式中不需要的属性的默认值?
- c# - 无法弄清楚为什么我的 Web API Core localhost 端点上会出现 404
- google-sheets-formula - 根据数字显示费用的公式
- c - 使用 Mutex 或 Semaphor 修复程序的最大线程数