【问题标题】:How to check if a number is in a interval如何检查数字是否在区间内
【发布时间】:2015-05-15 08:59:05
【问题描述】:

假设我得到:

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 的方式来做到这一点?

【问题讨论】:

  • 如果你的first_var 总是一个整数,你可以分别对 Python 3.x 和 Python 2.x 使用 range/xrange 对象并将它们与in 运算符结合起来进行快速的成员资格测试读起来像英语。示例:4 in range(3, 8) 请注意,stop 参数不包含范围,但您可以将范围分配给具有更具描述性名称的任何变量。

标签: python coding-style range intervals


【解决方案1】:

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

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

请注意,python 中的 cmets 以 # 开头

【讨论】:

    【解决方案2】:

    我用一个带有__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__,因此它不必搜索有效值。 xrange 在 Python 3 中不存在。

    此解决方案也适用于浮点数。

    另外,请注意,如果您使用 range,则需要小心 off-by-1 错误。如果您要执行一次或两次以上,最好封装它。

    【讨论】:

    • 请注意,这不会比 Python 3.x 的范围更有效(它也对__contains__ 使用简单的数学运算)。在您的 3.x REPL 中尝试 5555555555555 in range(99999999999999),您会看到它很快返回 True :) 但这是一个很好的解决方案,因为它可以处理浮点数,并且还可以拥有比范围对象更好的 __str__。它在各方面也比 Python 2.x range 和 xrange 更好。
    【解决方案3】:

    您可以使用 lambda:

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

    并像这样使用它:

    lmd(first_var, second_var, interval)
    

    但是有点长!

    【讨论】:

      【解决方案4】:
      if (first_var in range(second_var-interval, second_var+interval+1)):
          #Do something
      

      【讨论】:

      • 这只检查两个极端的相等性,这不是 OP 想要的。
      • @martineau 错了,它也适用于两者之间的整数,但它只适用于 first_var 是整数,而不是浮点数!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 2021-03-15
      • 1970-01-01
      相关资源
      最近更新 更多