确定整数是否在其他两个整数之间?


397

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

我正在使用2.3 IDLE,到目前为止,我一直没有尝试:

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

20
检查您的布尔运算符,如果数字大于30000,则数字当然会大于10000。仔细研究这些细节,您会发现更多的错误。
凯里


6
请更改> = 30000到<= 30000
Badiboy

Answers:


1044
if 10000 <= number <= 30000:
    pass

207
Python非常好:)。多余的是:这称为“时间间隔比较”。
马特·蒙塔格

这与if number in range(10000, 30001)其他解决方案所建议的速度之间的差异是多少?另外,使用set代替时是更快还是更慢range
宋祖

15
@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
Paolo Moretti

5
@MikeC尝试在您的shell中运行:> python -m timeit '10000 <= 10 <= 30000' > python -m timeit '10 in range(10000, 30001)' > python -m timeit '10 in set(range(10000, 30001))'
Paolo Moretti

3
看起来像在python3.5.2中一样,范围比if语句慢约10倍,并且范围检查值的速度是恒定的……这很可能是由于函数开销引起的差异。
amohr's

78
>>> 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

4
哇,我一直以为range(或xrange在python2中)返回一个生成器,因此您无法对其进行反复测试。
yegle 2014年

24
因此请记住,这4 in range(1,4)很重要,这是错误的。最好使用,1 >= r <= 4因为这样可以避免新手可能犯的错误
Tripplet

50
1.5 in rFalse即使在3.4中也给出。此答案仅对整数有用。
jpmc26 2016年

9
@tripplet,您犯了与OP相同的错误!,应该是1 <= r <= 4
John La Rooy

8
(1.)性能不佳(正如其他人指出的那样,此语法看起来不错,但执行起来可能会花费很长时间,因为它是O(n)运算与if a <= x <= b...的比较。)(2.)对于float类型不起作用(3 。)范围测试不包括在内。因此,许多开发人员可能会引入错误,因为他们期望范围包括在内
Trevor Boyd Smith

52

您的操作员不正确。应该是if number >= 10000 and number <= 30000:。此外,Python的缩写是if 10000 <= number <= 30000:


3
... 这种事情通常被称为链式比较
狼”,

30

您的代码段,

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文档中进一步描述此Python功能。



8

比较的麻烦在于,当您将一个>=应该放置在<=

#                             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

编辑:人们似乎更关注微基准标记以及如何进行酷链接操作。我的答案是关于防御性(错误的攻击面更少)的编程。

由于评论中有声明,因此我在此处为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

2
不幸的是,xrange在Python 3中已弃用。
2015年

1
@apraetor,可以range(10000, 30001)在Python3中使用。它不创建一个列表
约翰·拉ROOY

3
@JBChouinard,您绝对不正确。xrange在Python2或rangePython3中进行成员资格测试。如果您不相信,请自己尝试。<=只会提高效率,因为它不会创建范围对象。两种方式都为O(1)。该点位于OP 试图做到这一点的方式结束了一个错误。快速的错误代码会更糟。
John La Rooy

2
在i5上,(i)python 3.5:%timeit 5在range(10000,30000)1000个循环中,每个循环最好3:451 µs。%timeit 10000 <= 5 <= 30000 10000000个循环,每个循环最好3:59.4 ns。那是7000的一个因数
tback

1
@tback,如果有可能慢7000倍,我不会建议这样做。也许您可以尝试再次运行测试。
约翰·拉鲁伊

8

定义数字之间的范围:

r = range(1,10)

然后使用它:

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

3
range在您的情况下,不计算最后一个值10range(1,11)是正确的,如果您需要在1和10之间进行比较
ikbel benabdessamad19年

6

两种比较三个整数并检查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,但是它要慢得多。


0

假设有3个非负整数:ab,和c。从数学上讲,如果我们想确定是否c介于a和之间b,可以使用以下公式:

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

或在Python中:

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

这是错误的,举一个简单的例子a = 1,b = 2,c = 3 ba = 1 ca = 2(ba)*(ca)= 1 * 2> = 0 True => 3在1到2之间
理查德Ardelean

对不起,我犯了错误。我已经编辑了我的答案@RichardArdelean。
Anastasiya-Romanova秀

0

仅当数字介于10,000和30,000之间时,您才希望输出打印给定语句。

代码应该是;

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

3
已经提出了这个答案。您的答案对问题有什么帮助?
Jaideep Shekhar

0

条件应该是

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

使用的原因number == 10000是,如果number的值是50000,并且我们使用number >= 10000该条件,那么条件将过去,这不是您想要的。


例如,这将失败10001。他希望10000和30000。您的条件之间的数字将为数== 10000只工作
格雷罗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.