Python 检查两个浮点数是否在给定范围列表中的任何一个范围内
我有两个floatPython 检查两个浮点数是否在给定范围列表中的任何一个范围内,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
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