¿Determinar si el entero está entre otros dos enteros?

400

¿Cómo determino si un entero dado está entre otros dos enteros (por ejemplo, mayor que / igual a 10000y menor que / igual a 30000)?

Estoy usando 2.3 IDLE y lo que he intentado hasta ahora no funciona:

if number >= 10000 and number >= 30000:
    print ("you have to pay 5% taxes")
Niño promedio
fuente
20
Compruebe sus operadores booleanos, por supuesto, un número será mayor que 10000 si es mayor que 30000. Observe los pequeños detalles y detectará muchos más errores.
Kaili
2
Las comparaciones se pueden encadenar docs.python.org/2/reference/expressions.html#comparisons
theBuzzyCoder
77
Por favor cambie> = 30000 a <= 30000
Badiboy

Respuestas:

1048
if 10000 <= number <= 30000:
    pass
Paolo Moretti
fuente
209
Python es muy agradable :). Y para ser redundante: esto se llama "comparación de intervalos".
Matt Montag
¿Cuál es la diferencia de velocidad entre esto y if number in range(10000, 30001)lo sugerido por otra solución? Además, ¿es más rápido o más lento cuando se usa en setlugar de range?
Sung Cho
15
@MikeC Con la comparación de intervalos numberse compara primero con 10000. Si es menor que 10000la expresión se cortocircuita inmediatamente y no se verifica la segunda comparación. La complejidad es O(1). in range(0, n)en su lugar genera la secuencia completa de números y luego la itera. La complejidad es O(n). La complejidad de in set(range(0, n))todavía es O(n)porque la construcción de un conjunto tiene una complejidad temporal de O(n) ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt
Paolo Moretti
55
@MikeC Intenta correr en tu caparazón:> 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
parece que en python3.5.2, el rango es ~ 10 veces más lento que la instrucción if, con una velocidad constante con respecto al valor de verificación de rango ... por lo tanto, la diferencia más probable es debido a la sobrecarga de la función.
amohr
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
Bohdan
fuente
44
Wow, siempre pensé range(o xrangeen python2) devuelve un generador, por lo que no puede probarlo repetidamente.
yegle
24
Es importante tener en cuenta que 4 in range(1,4)es falso. Así que mejor use el 1 >= r <= 4ya que evita posibles errores por parte de los recién llegados
tripplet
50
1.5 in rda False, incluso en 3.4. Esta respuesta solo es buena para enteros.
jpmc26
99
@tripplet, ¡cometiste el mismo error que el OP !, debería serlo1 <= r <= 4
John La Rooy
8
(1.) mal rendimiento (como otros han señalado, esta sintaxis se ve bien pero puede tardar mucho tiempo en ejecutarse porque se trata de operaciones O (n) frente a if a <= x <= b...) (2.) no funciona para los floattipos (3 .) la prueba de rango no incluye ... muchos desarrolladores pueden introducir errores porque esperan un rango inclusivo
Trevor Boyd Smith
52

Su operador es incorrecto. Debe ser if number >= 10000 and number <= 30000:. Además, Python tiene una forma rápida para este tipo de cosas, if 10000 <= number <= 30000:.

Rayo Silas
fuente
3
... este tipo de cosas generalmente se llama comparación encadenada .
Wolf
30

Su fragmento de código,

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

en realidad comprueba si el número es mayor que 10000 y 30000.

Suponiendo que desea verificar que el número esté en el rango de 10000 a 30000, puede usar la comparación de intervalos de Python:

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

Esta característica de Python se describe más detalladamente en la documentación de Python .

Carl Ekerot
fuente
9
if number >= 10000 and number <= 30000:
    print ("you have to pay 5% taxes")
Sandro Munda
fuente
8

El problema con las comparaciones es que pueden ser difíciles de depurar cuando pones un lugar >=donde debería haber un<=

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

Python te permite simplemente escribir lo que quieres decir con palabras

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

En Python3, debe usar en rangelugar de xrange.

editar: Las personas parecen estar más preocupadas por las marcas de microbench y lo geniales que son las operaciones de encadenamiento. Mi respuesta es sobre la programación defensiva (menos superficie de ataque para errores).

Como resultado de un reclamo en los comentarios, he agregado el micro benchmark aquí para 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

Si le preocupa el rendimiento, puede calcular el rango una vez

$ python3.5 -m timeit -s "R=range(10000, 30000)" "5 in R"
10000000 loops, best of 3: 0.0551 usec per loop
John La Rooy
fuente
2
xrange está en desuso en Python 3, desafortunadamente.
Apraetor
1
@apraetor, sí, utilícelo range(10000, 30001)en Python3. No crea una lista
John La Rooy
3
@JBChouinard, eres absolutamente incorrecto. xrangeen Python2, o rangeen Python3 tienen pruebas de membresía. Pruébalo tú mismo si no crees. <=solo es más eficiente porque no crea un objeto de rango. Ambas formas como O (1). El punto es que el OP estaba tratando de hacerlo a su manera y terminó con un error . El código rápido que está mal es peor.
John La Rooy
2
en un i5, (i) python 3.5:% timeit 5 en rango (10000, 30000) 1000 bucles, lo mejor de 3: 451 µs por bucle. % timeit 10000 <= 5 <= 30000 10000000 bucles, lo mejor de 3: 59.4 ns por bucle. eso es un factor de más de 7000
tback
1
@tback, si hubiera una posibilidad de que fuera 7000 veces más lento, no lo habría sugerido. Quizás podría intentar ejecutar la prueba nuevamente.
John La Rooy
8

Defina el rango entre los números:

r = range(1,10)

Entonces úsalo:

if num in r:
    print("All right!")
joandiar91
fuente
3
rangeno cuenta el último valor 10 en su caso. range(1,11)es correcto, si necesita comparar entre 1 y 10
ikbel benabdessamad
6

Hay dos formas de comparar tres enteros y verificar si b está entre a y c :

if a < b < c:
    pass

y

if a < b and b < c:
    pass

El primero parece más legible, pero el segundo corre más rápido .

Comparemos usando 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
>>>

y usando 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

Además, puede usar el rango , como se sugirió anteriormente, sin embargo, es mucho más lento.

a_bridges
fuente
0

Supongamos que hay 3 no negativos números enteros: a, b, y c. Hablando matemáticamente, si queremos determinar si cestá entre ae b, inclusive, uno puede usar esta fórmula:

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

o en Python:

> print((c - a) * (b - c) >= 0)
True
Anastasiya-Romanova 秀
fuente
Esto está mal, tome el ejemplo simple a = 1, b = 2, c = 3 ba = 1 ca = 2 (ba) * (ca) = 1 * 2> = 0 Verdadero => 3 está entre 1 y 2
Richard Ardelean
Perdón por el error que cometí. He editado mi respuesta @RichardArdelean.
Anastasiya-Romanova 秀
0

Desea que la salida imprima la declaración dada si y solo si el número cae entre 10,000 y 30,000.

El código debería ser;

if number >= 10000 and number <= 30000:
    print("you have to pay 5% taxes")
Steffny Marif Bill
fuente
3
Esta respuesta ya ha sido sugerida. ¿Qué agrega su respuesta a la pregunta?
Jaideep Shekhar
0

La condición debería ser,

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

La razón para usar number == 10000es que si el valor del número es 50000 y si usamos number >= 10000la condición pasará, que no es lo que desea.

Sadaf
fuente
Sin embargo, esto fallará para 10001, por ejemplo. Quiere números entre 10000 y 30000. Su condición solo funcionará para number == 10000.
guerreiro