Python 检查两个浮点数是否在给定范围列表中的任何一个范围内

Python 检查两个浮点数是否在给定范围列表中的任何一个范围内,python,comparison,Python,Comparison,我有两个floatno_a和no_b和两个范围,表示为两个元素列表,包含上下边框 我想检查数字是否都在以下范围之一:[0,0.33],[0.33,0.66],或[0.66,1.0] 如何在Python代码中巧妙地编写该语句? < P>如果您只想获得真< /COD>或 false 结果,请考虑以下内容: >>> a = 0.4 >>> b = 0.6 >>> >>> ranges = [[0,0.33], [0.33,0.6

我有两个float
no_a
no_b
和两个范围,表示为两个元素列表,包含上下边框

我想检查数字是否都在以下范围之一:
[0,0.33]
[0.33,0.66]
,或
[0.66,1.0]


如何在Python代码中巧妙地编写该语句?

< P>如果您只想获得<代码>真< /COD>或<代码> false 结果,请考虑以下内容:

>>> a = 0.4
>>> b = 0.6
>>> 
>>> ranges = [[0,0.33], [0.33,0.66], [0.66,1.0]]
>>> 
>>> any(low <= a <= high and low <= b <= high for low, high in ranges)
True
看一看

将您的
no_a
no_b
放入一个数组,检查是否所有事件都通过了您的语句


第二次编辑: 如前所述,对于这个小数据集,内置的
all
函数的性能优于numpy版本,因此numpy的使用已被删除:

ranges = [[0,0.33], [0.33,0.66], [0.66,1.0]]

for i in range(len(ranges)):
    if all([ranges[i][0] < no_a < ranges[i][1], 
            ranges[i][0] < no_b < ranges[i][1]]):
        print('Both values are in the interval of %s' %ranges[i])
范围=[[0,0.33],[0.33,0.66],[0.66,1.0]]
对于范围内的i(len(ranges)):
如果所有([ranges[i][0]
这将打印出两个值的范围。

如下所示:

RANGES = [[0,0.33], [0.33,0.66], [0.66,1.0]]


def check(no_a, no_b):
    for rng in RANGES:
        if rng[0] < no_a < rng[1] and rng[0] < no_b < rng[1]:
            return True
    else:
        return False


print(check(.1, .2))
print(check(.1, .4))
或者像这样:

no_a, no_b = .1, .2
print(any(rng[0] < no_a < rng[1] and rng[0] < no_b < rng[1] for rng in RANGES))
no_a, no_b = .1, .4
print(any(rng[0] < no_a < rng[1] and rng[0] < no_b < rng[1] for rng in RANGES))
使用广播的Numpy 只要其中任何一个是
真的

a.all(0)

[False  True False]
a.all(0).any()

True

小红人 但是,我们可以将
检查
范围
转换为执行一个比较操作

b = [1, -1]
(check.T * b >= ranges * b).all(1).any()

True

你有没有试过但发现不够整洁的东西?但是范围的限制会发生什么呢?@konstantin我不确定我是否理解。你是说边界是否包括在内?您可以使用
对其进行微调,您是正确的@timgeb。我之前很赶时间,所以给你。说得好。我对它进行了计时,实际上内置的
all
速度更快。我做了第二次编辑,删除了numpy。好多了,但请看我关于JoséPedro Duarte回答的
any
。(
all
any
具有类似的行为)。然而,我认为OP想要
any
而不是
all
import numpy as np

check = np.array([[0.4], [0.6]])
ranges = np.array([[0,0.33], [0.33,0.66], [0.66,1.0]])

((check >= ranges[:, 0]) & (check <= ranges[:, 1])).all(0).any()

True
check >= ranges[:, 0]

#  0.00  0.33  0.66     <
[[ True  True False]  # 0.4
 [ True  True False]] # 0.6
check <= ranges[:, 1]

#  0.33  0.66  1.00      >     
[[False  True  True]   # 0.4
 [False  True  True]]  # 0.6
a = (check >= ranges[:, 0]) & (check <= ranges[:, 1])
a

#  0.00  0.33  0.66      <
#  0.33  0.66  1.00      >     
[[False  True False]   # 0.4
 [False  True False]]  # 0.6
a.all(0)

[False  True False]
a.all(0).any()

True
b = [1, -1]
(check.T * b >= ranges * b).all(1).any()

True