查看 Python 中特定值周围的 +/- 范围的优雅方式
Elegant way to look at a +/- range surounding a particular value in Python
我正在使用 openpyxl 库处理电子表格中的大量数据。
我需要找到特定的温度值,然后根据该温度查看其他电池。
问题是我的温度在测量时有一点波动,但我并不关心这个。
例如,如果我想查看 25 度外的数据,我真正想要的是大约 24 - 26 度范围内的数据。我需要针对多个温度执行此操作。
我知道如何以这样一种相当混乱的迭代方式来做到这一点:
for num in [5,10,15,20,25]:
if temp > num -1 and temp < num + 1:
#do things
但这对我来说感觉很乱,有没有更干净的方法呢?比如检查温度是否在 num?
的某个误差范围内
您可以测试一个值是否在这样的范围内:
for num in [5,10,15,20,25]:
if num in range(24,27):
...
请注意,如果您的传入数据是浮点数,这将不起作用。
你当然可以使用一些函数生成这个范围,你给它一个中心和最大距离:
def s_range(center, max_distance): # surrounding range
return range(center-max_distance, center+max_distance)
...
if num in s_range(25, 1):
...
你现在清楚了; Python 允许您像这样链接比较:
for num in [5,10,15,20,25]:
if num - 1 <= temp <= num + 1:
#do things
另一种方法是检查两者之间的绝对值:
for num in [5, 10, 15, 20, 25]:
if abs(num - temp) <= 1
(如果 temp
是一个整数,您需要使用 <=
而不是 <
来使表达式不同于简单的 temp == num
。)
如果你只是想稍微调整一下现有的:
for num in range(5, 30, 5):
if abs(temp - num) < 1:
# do things
对于这样的事情,我写了一个 generic range comparison function,您可以轻松地扩展它以在此处使用。虽然对于这种情况可能有点矫枉过正,但如果您有很多具有不同值的类似检查,这就很有意义了。
这样使用:
range_comparison(operator.lt, [25, True], 24) # returns True
range_comparison(operator.lt, [25, True], 26) # returns None
您可以将其与您自己的函数结合使用以获得更大的灵活性。
内置解决方案怎么样?您可以只使用 isclose
function located in math
(从 Python 3.5
开始可用):
from math import isclose
isclose(26, 25, abs_tol=1)
Out[409]: True
isclose(24, 25, abs_tol=1)
Out[410]: True
isclose(26.3, 25, abs_tol=1)
Out[411]: False
abs_tol
表示绝对公差(即差异),以便将两个数字视为接近,isclose
至 return True
.
对于Python 2.x中想要使用内置函数的人,还有numpy.isclose()
from numpy import isclose as isclose
a = 100.0
b = 100.01
print isclose(a,b, atol=0.02) # True
来自文档:
For finite values, isclose uses the following equation to test whether
two floating point values are equivalent.
absolute(a - b) <= (atol + rtol * absolute(b))
我正在使用 openpyxl 库处理电子表格中的大量数据。
我需要找到特定的温度值,然后根据该温度查看其他电池。
问题是我的温度在测量时有一点波动,但我并不关心这个。
例如,如果我想查看 25 度外的数据,我真正想要的是大约 24 - 26 度范围内的数据。我需要针对多个温度执行此操作。
我知道如何以这样一种相当混乱的迭代方式来做到这一点:
for num in [5,10,15,20,25]:
if temp > num -1 and temp < num + 1:
#do things
但这对我来说感觉很乱,有没有更干净的方法呢?比如检查温度是否在 num?
的某个误差范围内您可以测试一个值是否在这样的范围内:
for num in [5,10,15,20,25]:
if num in range(24,27):
...
请注意,如果您的传入数据是浮点数,这将不起作用。 你当然可以使用一些函数生成这个范围,你给它一个中心和最大距离:
def s_range(center, max_distance): # surrounding range
return range(center-max_distance, center+max_distance)
...
if num in s_range(25, 1):
...
你现在清楚了; Python 允许您像这样链接比较:
for num in [5,10,15,20,25]:
if num - 1 <= temp <= num + 1:
#do things
另一种方法是检查两者之间的绝对值:
for num in [5, 10, 15, 20, 25]:
if abs(num - temp) <= 1
(如果 temp
是一个整数,您需要使用 <=
而不是 <
来使表达式不同于简单的 temp == num
。)
如果你只是想稍微调整一下现有的:
for num in range(5, 30, 5):
if abs(temp - num) < 1:
# do things
对于这样的事情,我写了一个 generic range comparison function,您可以轻松地扩展它以在此处使用。虽然对于这种情况可能有点矫枉过正,但如果您有很多具有不同值的类似检查,这就很有意义了。
这样使用:
range_comparison(operator.lt, [25, True], 24) # returns True
range_comparison(operator.lt, [25, True], 26) # returns None
您可以将其与您自己的函数结合使用以获得更大的灵活性。
内置解决方案怎么样?您可以只使用 isclose
function located in math
(从 Python 3.5
开始可用):
from math import isclose
isclose(26, 25, abs_tol=1)
Out[409]: True
isclose(24, 25, abs_tol=1)
Out[410]: True
isclose(26.3, 25, abs_tol=1)
Out[411]: False
abs_tol
表示绝对公差(即差异),以便将两个数字视为接近,isclose
至 return True
.
对于Python 2.x中想要使用内置函数的人,还有numpy.isclose()
from numpy import isclose as isclose
a = 100.0
b = 100.01
print isclose(a,b, atol=0.02) # True
来自文档:
For finite values, isclose uses the following equation to test whether two floating point values are equivalent.
absolute(a - b) <= (atol + rtol * absolute(b))