如何检查一个数字是否在一个区间内
How to check if a number is in a interval
假设我得到:
first_var = 1
second_var = 5
interval = 2
我想要一个从 second_var 开始的间隔,例如 second_var ± interval
(从 3 到 7)。
我想检查 first_var 是否在该间隔内。
所以在这种特定情况下,我想要 False
如果first_var = 4
,我要True
我能做到:
if (first_var > second_var-interval) and (first_var < second_var+interval):
#True
是否有更 pythonic 的方法来做到这一点?
您可以使用类似数学的序列,因为 Python 支持
if (second_var-interval < first_var < second_var+interval):
# True
请注意 python 中的评论以 #
开头
if (first_var in range(second_var-interval, second_var+interval+1)):
#Do something
您可以使用 lambda:
lmd = lambda fv, sv, inval: print('True') if \
sv - inval < fv < sv + inval else print('False')
并像这样使用它:
lmd(first_var, second_var, interval)
但是有点长!
我用一个class和__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 这个解决方案比使用 range
或 xrange
更有效,因为它们没有实现 __contains__
并且它们必须搜索匹配值.
Python 3 更聪明,range
是一个生成对象,它像 xrange
一样高效,但也实现了 __contains__
,因此它不必搜索一个有效的值。 xrange
不存在于 Python 3.
此解决方案也适用于浮点数。
此外,请注意,如果您使用 range
,则需要注意 off-by-1 错误。最好封装它,如果你要不止一次或两次这样做。
假设我得到:
first_var = 1
second_var = 5
interval = 2
我想要一个从 second_var 开始的间隔,例如 second_var ± interval
(从 3 到 7)。
我想检查 first_var 是否在该间隔内。
所以在这种特定情况下,我想要 False
如果first_var = 4
,我要True
我能做到:
if (first_var > second_var-interval) and (first_var < second_var+interval):
#True
是否有更 pythonic 的方法来做到这一点?
您可以使用类似数学的序列,因为 Python 支持
if (second_var-interval < first_var < second_var+interval):
# True
请注意 python 中的评论以 #
if (first_var in range(second_var-interval, second_var+interval+1)):
#Do something
您可以使用 lambda:
lmd = lambda fv, sv, inval: print('True') if \
sv - inval < fv < sv + inval else print('False')
并像这样使用它:
lmd(first_var, second_var, interval)
但是有点长!
我用一个class和__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 这个解决方案比使用 range
或 xrange
更有效,因为它们没有实现 __contains__
并且它们必须搜索匹配值.
Python 3 更聪明,range
是一个生成对象,它像 xrange
一样高效,但也实现了 __contains__
,因此它不必搜索一个有效的值。 xrange
不存在于 Python 3.
此解决方案也适用于浮点数。
此外,请注意,如果您使用 range
,则需要注意 off-by-1 错误。最好封装它,如果你要不止一次或两次这样做。