Determinar se o número inteiro está entre dois outros números inteiros?


398

Como determino se um número inteiro está entre dois outros números inteiros (por exemplo, maior que / igual a 10000e menor que / igual a 30000)?

Estou usando o 2.3 IDLE e o que tentei até agora não está funcionando:

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

20
Verifique seus operadores booleanos, é claro que um número será maior que 10000 se for maior que 30000. Veja os pequenos detalhes e você perceberá muito mais erros.
Kaili


6
Pls mudança> = 30000 a <= 30000
Badiboy

Respostas:


1046
if 10000 <= number <= 30000:
    pass

208
Python é tão bom :). E para ser redundante: isso é chamado de "comparação de intervalo".
Matt Montag

Qual é a diferença de velocidade entre isso e if number in range(10000, 30001)como sugerido por outra solução? Além disso, é mais rápido ou mais lento ao usar em setvez de range?
`` Sung Cho

15
@ MikeC Com a comparação do intervalo, numberprimeiro é comparada a 10000. Se for menor do que 10000a expressão será imediatamente colocada em curto-circuito e a segunda comparação não será verificada. A complexidade é O(1). in range(0, n)em vez disso, gera toda a sequência de números e depois itera. A complexidade é O(n). A complexidade da in set(range(0, n))ainda é O(n)porque a construção de um conjunto tem uma complexidade de tempo de O(n) ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt
Paolo Moretti

5
@MikeC Tente rodar no seu 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
parece em python3.5.2, o alcance é ~ 10x mais lento que a instrução if, com velocidade constante em relação ao valor de verificação do intervalo ... portanto, a diferença mais provável devido à sobrecarga da função.
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

4
Uau, eu sempre pensei range(ou xrangeem python2) retorna um gerador, assim você não pode testar repetidamente nele.
yegle

24
É importante ter em mente que isso 4 in range(1,4)é falso. Então é melhor usar o 1 >= r <= 4
método

50
1.5 in rFalse, mesmo em 3.4. Essa resposta é boa apenas para números inteiros.
jpmc26

9
@ tripplet, você cometeu o mesmo erro que o OP !, Deveria ser1 <= r <= 4
John La Rooy

8
(1.) desempenho ruim (como outros já apontaram, esta sintaxe parece ser boa, mas pode levar muito tempo para ser executada porque são O (n) operações versus as if a <= x <= b...) (2.) não funciona para floattipos (3 .) o teste de gama não é incluído ... tantos desenvolvedores podem introduzir erros porque esperam gama inclusiva
Trevor Boyd Smith

52

O seu operador está incorreto. Deveria ser if number >= 10000 and number <= 30000:. Além disso, o Python possui uma abreviação para esse tipo de coisa if 10000 <= number <= 30000:,.


3
... esse tipo de coisa é normalmente chamado de comparação encadeada .
Wolf

30

Seu snippet de código,

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

na verdade, verifica se o número é maior que 10000 e 30000.

Supondo que você deseja verificar se o número está no intervalo de 10000 a 30000, você pode usar a comparação de intervalo do Python:

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

Esse recurso do Python é descrito mais detalhadamente na documentação do Python .


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

8

O problema das comparações é que elas podem ser difíceis de depurar quando você coloca um local >=onde deve haver um<=

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

Python permite que você escreva o que você quer dizer com palavras

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

No Python3, você precisa usar em rangevez de xrange.

editar: As pessoas parecem estar mais preocupadas com as marcas de microbench e com as operações legais de encadeamento. Minha resposta é sobre programação defensiva (menos superfície de ataque para bugs).

Como resultado de uma reivindicação nos comentários, adicionei aqui o micro benchmark para o 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

Se você está preocupado com o desempenho, pode calcular o intervalo uma vez

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

2
Infelizmente, o xrange está obsoleto no Python 3.
Apraetor 02/03

11
@ aprprador, sim, use range(10000, 30001)em Python3. Ele não cria uma lista
John La Rooy

3
@JBChouinard, você está absolutamente incorreto. xrangeno Python2 ou rangeno Python3 tem testes de associação. Tente você mesmo se não acredita. <=é apenas mais eficiente porque não cria um objeto de intervalo. Nos dois sentidos como O (1). O ponto é que o OP estava tentando fazer do seu jeito e acabou com um bug . Código rápido errado está pior.
John La Rooy

2
em um i5, (i) python 3,5:% timeit 5 no intervalo (10000, 30000) 1000 loops, melhor de 3: 451 µs por loop. % timeit 10000 <= 5 <= 30000 10000000 loops, o melhor de 3: 59,4 ns por loop. que é um fator de mais de 7000
tback

11
@backback, Se houvesse uma chance de 7000 vezes mais lenta, eu não sugeriria. Talvez você possa tentar executar o teste novamente.
John La Rooy 11/11

8

Defina o intervalo entre os números:

r = range(1,10)

Então use-o:

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

3
rangenão conta o último valor 10 no seu caso. range(1,11)está correto, se você precisar comparar entre 1 e 10
ikbel benabdessamad 18/04/19

6

duas maneiras de comparar três números inteiros e verificar se b está entre a e c :

if a < b < c:
    pass

e

if a < b and b < c:
    pass

O primeiro parece mais legível, mas o segundo corre mais rápido .

Vamos comparar 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
>>>

e 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

Além disso, você pode usar o alcance , conforme sugerido anteriormente, porém é muito mais lento.


0

Suponha que há 3 inteiros não negativos: a, b, e c. Matematicamente falando, se queremos determinar se cestá entre ae b, inclusive, pode-se usar esta fórmula:

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

ou em Python:

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

Isso está errado, tome o exemplo simples a = 1, b = 2, c = 3 ba = 1 ca = 2 (ba) * (ca) = 1 * 2> = 0 Verdadeiro => 3 está entre 1 e 2
Richard Ardelean

Desculpe pelo erro que cometi. Eu editei minha resposta @RichardArdelean.
Anastasiya-Romanova 秀

0

Você deseja que a saída imprima a instrução fornecida se e somente se o número estiver entre 10.000 e 30.000.

Código deve ser;

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

3
Esta resposta já foi sugerida. O que sua resposta adiciona à pergunta?
Jaideep Shekhar 11/01

0

A condição deve ser,

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

A razão para usar number == 10000é que, se o valor do número for 50000 e se usarmos, number >= 10000a condição será aprovada, e não é isso que você deseja.


Isso irá falhar para 10001, por exemplo. Ele quer números entre 10000 e 30000. Sua condição só funcionará para o número == 10000.
guerreiro
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.