查看 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))