如何检查某个数字是否在一个区间

时间:2015-05-15 08:59:05

标签: python coding-style range intervals

假设我得到了:

first_var = 1
second_var = 5
interval = 2

我希望从second_var ± interval(从3到7)的second_var有一个间隔。 我想知道first_var是否在那段时间内。 所以在这种特殊情况下,我想要False 如果first_var = 4,我想要True

我可以这样做:

if (first_var > second_var-interval) and (first_var < second_var+interval):
  #True

有更多的pythonic方法吗?

4 个答案:

答案 0 :(得分:8)

您可以使用类似数学的序列,因为Python支持

if (second_var-interval < first_var < second_var+interval):
     # True

请注意,python中的注释以#

开头

答案 1 :(得分:3)

我使用__contains__的类来表示间隔:

class Interval(object):
    def __init__(self, middle, deviation):
        self.lower = middle - abs(deviation)
        self.upper = middle + abs(deviation)

    def __contains__(self, item):
        return self.lower <= item <= self.upper

然后我定义了一个函数interval来简化语法:

def interval(middle, deviation):
    return Interval(middle, deviation)

然后我们可以这样称呼它:

>>> 8 in interval(middle=6, deviation=2)
True

>>> 8 in interval(middle=6, deviation=1)
False

使用Python 2,此解决方案比使用rangexrange更有效,因为它们未实现__contains__,并且必须搜索匹配值。

Python 3更智能,range是一个生成对象,效率与xrange类似,但也实现__contains__,因此不必搜索有效值。 Python 3中不存在xrange

此解决方案也适用于浮动。

另外,请注意,如果您使用range,则需要注意1分之一的错误。最好将其封装起来,如果你要做的不止一次或两次。

答案 2 :(得分:1)

你可以使用lambdas:

lmd = lambda fv, sv, inval: print('True') if \
    sv - inval < fv < sv + inval else print('False')

并使用它:

lmd(first_var, second_var, interval)

但它有点长!

答案 3 :(得分:0)

if (first_var in range(second_var-interval, second_var+interval+1)):
    #Do something