【问题标题】:Determine whether integer is between two other integers确定整数是否在其他两个整数之间?
【发布时间】:2012-11-17 16:54:02
【问题描述】:

如何确定给定整数是否介于其他两个整数之间(例如,大于/等于10000 和小于/等于30000)?

我正在使用 2.3 IDLE,但到目前为止我尝试的方法不起作用:

if number >= 10000 and number >= 30000:
    print ("you have to pay 5% taxes")

【问题讨论】:

  • 检查你的布尔运算符,当然,如果大于 30000,数字将大于 10000。看看小细节,你会发现更多的错误。
  • 请将 >= 30000 更改为
  • 对这个问题的最后一次编辑只是将“解决方案”放入问题代码中。 (使问题有些无效,我认为违背了这篇文章的目的。)
  • 这个问题显然是指这种比较的语法,与 >= 30000 的错误无关。编辑很好。

标签: python


【解决方案1】:
if 10000 <= number <= 30000:
    pass

详情请见docs

【讨论】:

  • Python 真是太好了 :)。并且是多余的:这称为“区间比较”。
  • @MikeC 在区间比较中,number 首先与10000 进行比较。如果它小于10000,则表达式立即短路并且不检查第二次比较。复杂度为O(1)in range(0, n) 而是生成整个数字序列,然后对其进行迭代。复杂度为O(n)in set(range(0, n)) 的复杂度仍然是 O(n),因为构建集合的时间复杂度为 O(n) ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt
  • @MikeC 尝试在你的shell中运行:&gt; python -m timeit '10000 &lt;= 10 &lt;= 30000'&gt; python -m timeit '10 in range(10000, 30001)'&gt; python -m timeit '10 in set(range(10000, 30001))'
  • 看起来像在 python3.5.2 中,范围比 if 语句慢约 10 倍,关于范围检查值的速度恒定......因此很可能由于函数开销而存在差异。
  • @Catbuilts 我也发现了这个,javascript中是否有这样的运算符。
【解决方案2】:
>>> r = range(1, 4)
>>> 1 in r
True
>>> 2 in r
True
>>> 3 in r
True
>>> 4 in r
False
>>> 5 in r
False
>>> 0 in r
False

【讨论】:

  • 哇,我一直认为range(或python2中的xrange)返回一个生成器,因此你不能重复测试它。
  • 重要的是要记住4 in range(1,4) 是假的。所以最好使用1 &gt;= r &lt;= 4,因为它可以避免新手可能出现的错误
  • 1.5 in r 给出False,即使在 3.4 中也是如此。这个答案只适用于整数。
  • @tripplet,你犯了和OP一样的错误!,应该是1 &lt;= r &lt;= 4
  • (1.) 性能不佳(正如其他人指出的那样,这种语法 看起来不错 但可能需要很长时间才能执行,因为它是 O(n) 操作而不是 @ 987654329@...) (2.) 不适用于 float 类型 (3.) 范围测试不包含在内...所以许多开发人员可能会引入错误,因为他们期望包含范围
【解决方案3】:

您的接线员不正确。应该是if number &gt;= 10000 and number &lt;= 30000:。此外,Python 还为这类事情提供了一个简写形式,if 10000 &lt;= number &lt;= 30000:

【讨论】:

【解决方案4】:

你的代码 sn-p,

if number >= 10000 and number >= 30000:
    print ("you have to pay 5% taxes")

实际检查数字是否大于 10000 和 30000。

假设您要检查数字是否在 10000 - 30000 范围内,您可以使用 Python 区间比较:

if 10000 <= number <= 30000:
    print ("you have to pay 5% taxes")

此 Python 功能在in the Python documentation 中有进一步描述。

【讨论】:

  • 你也可以用它来进行初始比较,虽然它同样没用:if 10000
【解决方案5】:

两种方法比较三个整数并检查b是否在ac之间:

if a < b < c:
    pass

if a < b and b < c:
    pass

第一个看起来更易读,但第二个运行得更快

让我们使用 dis.dis 进行比较:

>>> dis.dis('a < b and b < c')
  1           0 LOAD_NAME                0 (a)
              2 LOAD_NAME                1 (b)
              4 COMPARE_OP               0 (<)
              6 JUMP_IF_FALSE_OR_POP    14
              8 LOAD_NAME                1 (b)
             10 LOAD_NAME                2 (c)
             12 COMPARE_OP               0 (<)
        >>   14 RETURN_VALUE
>>> dis.dis('a < b < c')
  1           0 LOAD_NAME                0 (a)
              2 LOAD_NAME                1 (b)
              4 DUP_TOP
              6 ROT_THREE
              8 COMPARE_OP               0 (<)
             10 JUMP_IF_FALSE_OR_POP    18
             12 LOAD_NAME                2 (c)
             14 COMPARE_OP               0 (<)
             16 RETURN_VALUE
        >>   18 ROT_TWO
             20 POP_TOP
             22 RETURN_VALUE
>>>

并使用 timeit

~$ python3 -m timeit "1 < 2 and 2 < 3"
10000000 loops, best of 3: 0.0366 usec per loop

~$ python3 -m timeit "1 < 2 < 3"
10000000 loops, best of 3: 0.0396 usec per loop

另外,您可以使用 range,如前所述,但速度要慢得多。

【讨论】:

    【解决方案6】:

    定义数字之间的范围:

    r = range(1,10)
    

    然后使用它:

    if num in r:
        print("All right!")
    

    【讨论】:

    • range 在您的情况下不计算最后一个值 10range(1,11)是正确的,如果需要比较1和10
    【解决方案7】:
    if number >= 10000 and number <= 30000:
        print ("you have to pay 5% taxes")
    

    【讨论】:

      【解决方案8】:

      比较的问题在于,当您将 &gt;= 放在应该有 &lt;= 的位置时,它们可能难以调试

      #                             v---------- should be <
      if number >= 10000 and number >= 30000:
          print ("you have to pay 5% taxes")
      

      Python 让你只需你的意思

      if number in xrange(10000, 30001): # ok you have to remember 30000 + 1 here :)
      

      在 Python3 中,您需要使用range 而不是xrange

      edit:人们似乎更关心微基准测试以及链接操作有多酷。我的回答是关于防御性(错误的攻击面更少)编程。

      由于 cmets 中的声明,我在此处为 Python3.5.2 添加了微基准

      $ python3.5 -m timeit "5 in range(10000, 30000)"
      1000000 loops, best of 3: 0.266 usec per loop
      $ python3.5 -m timeit "10000 <= 5 < 30000"
      10000000 loops, best of 3: 0.0327 usec per loop
      

      如果你担心性能,你可以计算一次范围

      $ python3.5 -m timeit -s "R=range(10000, 30000)" "5 in R"
      10000000 loops, best of 3: 0.0551 usec per loop
      

      【讨论】:

      • 不幸的是,xrange 在 Python 3 中已被弃用。
      • @apraetor,是的,在 Python3 中使用 range(10000, 30001)。它不会创建列表
      • @JBChouinard,你完全不正确。 Python2 中的 xrange 或 Python3 中的 range 具有成员资格测试。不信你自己试试。 &lt;= 只是更有效,因为它不创建范围对象。两种方式都为 O(1)。关键是 OP 试图按照你的方式去做,结果出现了一个错误。错误的快速代码更糟糕。
      • 在 i5 上,(i)python 3.5: %timeit 5 in range(10000, 30000) 1000 个循环,最好的 3:每个循环 451 µs。 %timeit 10000
      • @tback,如果有机会慢 7000 倍,我不会建议这样做。也许您可以尝试再次运行测试。
      【解决方案9】:

      假设有 3 个非负整数:abc。从数学上讲,如果我们要确定c 是否介于ab 之间,包括在内,可以使用这个公式:

      (c - a) * (b - c) >= 0

      或在 Python 中:

      > print((c - a) * (b - c) >= 0)
      True
      

      【讨论】:

        【解决方案10】:

        虽然 10 &lt;= number &lt;= 20 在 Python 中工作,但我发现使用 range() 的这种表示法更具可读性:

        if number in range(10, 21):
            print("number is between 10 (inclusive) and 21 (exclusive)")
        else:
            print("outside of range!")
        

        请记住,第二个上限参数不包含在范围集中,可以通过以下方式进行验证:

        >>> list(range(10, 21))
        [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
        

        【讨论】:

        • 请注意 10 &lt;= 10.5 &lt;= 20 是 True 而 10.5 in range(10, 21) 是 False;根据情况,这可能是也可能不是你想要的
        • 虽然浮点数确实如此,但 OP 准确地询问了整数比较。
        • 啊,他们有;在这种情况下,这两个表达式确实是等价的
        【解决方案11】:

        当且仅当数字在 10,000 到 30,000 之间时,您希望输出打印给定的语句。

        代码应该是;

        if number >= 10000 and number <= 30000:
            print("you have to pay 5% taxes")
        

        【讨论】:

        • 这个答案已经被建议了。您的回答对问题有何补充?
        【解决方案12】:

        你使用 >=30000,所以如果数字是 45000 它将进入循环,但我们需要它大于 10000 但小于 30000。将其更改为

        【讨论】:

        【解决方案13】:

        以下是几种可能的方法,按性能从好到差排序(即第一个性能最好)

         if 10000 <= b and b <=30000:
            print ("you have to pay 5% taxes")
        
         if 10000 <= number <= 30000:
            print ("you have to pay 5% taxes")
        
         if number in range(10000,30001):
            print ("you have to pay 5% taxes")
        

        【讨论】:

          【解决方案14】:

          试试这个简单的功能;它检查A 是否在BC 之间(BC 的顺序可能不正确):

          def isBetween(A, B, C):
              Mi = min(B, C)
              Ma = max(B, C)
              return Mi <= A <= Ma
          

          所以isBetween(2, 10, -1)isBetween(2, -1, 10) 相同。

          【讨论】:

            【解决方案15】:

            条件应该是,

            if number == 10000 and number <= 30000:
                 print("5% tax payable")
            

            使用number == 10000 的原因是,如果数字的值为50000,如果我们使用number &gt;= 10000,则条件将通过,这不是您想要的。

            【讨论】:

            • 但是,例如,对于 10001,这将失败。他想要介于 10000 和 30000 之间的数字。您的条件仅适用于数字 == 10000。
            • 这将因用户的要求而失败。这不是一个合适的解决方案。
            猜你喜欢
            • 1970-01-01
            • 2017-03-31
            • 2023-01-09
            • 2020-02-03
            • 2013-06-10
            • 2012-11-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多