2016-07-15 49 views
2

我正在使用openpyxl库在电子表格中处理大量数据。优雅的方式来看看在Python中超过特定​​值的+/-范围

我需要找到某些温度值,然后根据该温度查看其他单元。

问题是我的温度在它的测量值有些波动,但我并不在意这一点。例如,如果我想查看25度外的数据,我真正想要的是大约24-26度的数据。我需要在很多温度下做到这一点。

我知道如何在一个相当混乱的迭代的方式这样做:

for num in [5,10,15,20,25]:  
    if temp > num -1 and temp < num + 1:   
     #do things 

但这只是感觉凌乱对我来说,有没有清洁的方式做到这一点?比如检查temp是否在num的某个错误之内?

回答

3

你现在有什么是明确的; 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不同。)

0

您可以测试值在这样的范围内:

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): 
    ... 
2

如果你只是想适应你有一点点:

for num in range(5, 30, 5): 
    if abs(temp - num) < 1: 
     # do things 
0

对于这样的事情,我写了一个generic range comparison function,你可以很容易地在这里使用扩展。虽然对于这种情况可能是过度的,但如果你有很多类似的检查有不同的值,那么这很有意义。

使用方法如下:

range_comparison(operator.lt, [25, True], 24) # returns True 
range_comparison(operator.lt, [25, True], 26) # returns None 

你用自己的功能结合本作更多的灵活性。

1

内置解决方案如何?你可以只使用isclose功能位于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回到True

0

对于那些谁想要在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 

从文档:

对于有限值,isclose使用以下方程来测试两个浮点值是否相等。

absolute(a - b) <= (atol + rtol * absolute(b)) 
相关问题