Determinare se il numero intero è compreso tra altri due numeri interi?


399

Come posso determinare se un dato numero intero è compreso tra altri due numeri interi (ad esempio maggiore di / uguale a 10000e minore di / uguale a 30000)?

Sto usando 2.3 IDLE e quello che ho provato finora non funziona:

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

20
Controlla i tuoi operatori booleani, ovviamente un numero sarà maggiore di 10000 se è maggiore di 30000. Guarda i piccoli dettagli e vedrai molti più errori.
Kaili,


6
Per favore cambia> = da 30000 a <= 30000
Badiboy,

Risposte:


1047
if 10000 <= number <= 30000:
    pass

208
Python è così bello :). E per essere ridondanti: questo si chiama "confronto a intervalli".
Matt Montag,

Qual è la differenza di velocità tra questo e if number in range(10000, 30001)come suggerito da un'altra soluzione? Inoltre, è più veloce o più lento quando si utilizza setinvece di range?
Cantato Cho

15
@MikeC Con il confronto degli intervalli numberviene prima confrontato con 10000. Se è inferiore 10000all'espressione viene immediatamente cortocircuitato e il secondo confronto non viene verificato. La complessità è O(1). in range(0, n)genera invece l'intera sequenza di numeri e quindi scorre attraverso di essa. La complessità è O(n). La complessità di in set(range(0, n))è ancora O(n)perché la costruzione di un set ha una complessità temporale di O(n) ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt
Paolo Moretti

5
@MikeC Prova a correre nella tua 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
sembra in python3.5.2, l'intervallo è ~ 10 volte più lento dell'istruzione if, con una velocità costante rispetto al valore di controllo dell'intervallo ... quindi molto probabilmente differenza dovuta al sovraccarico della funzione.
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
Wow, ho sempre pensato range(o xrangein python2) di restituire un generatore, quindi non puoi ripetutamente testarlo.
yegle

24
È importante tenere presente che 4 in range(1,4)è falso. Quindi meglio usare il 1 >= r <= 4come evita possibili errori da parte dei nuovi arrivati
tripplet

50
1.5 in rFalse, anche in 3.4. Questa risposta è valida solo per i numeri interi.
jpmc26,

9
@tripplet, hai commesso lo stesso errore dell'OP !, Dovrebbe essere1 <= r <= 4
John La Rooy

8
(1.) cattive prestazioni (come altri hanno sottolineato questa sintassi sembra buona, ma può richiedere molto tempo per l'esecuzione perché sono operazioni O (n) vs if a <= x <= b...) (2.) non funziona per i floattipi (3) .) il test della portata non è inclusivo ... quindi molti sviluppatori possono introdurre bug perché si aspettano una portata inclusiva
Trevor Boyd Smith,

52

Il tuo operatore non è corretto. Dovrebbe essere if number >= 10000 and number <= 30000:. Inoltre, Python ha una scorciatoia per questo genere di cose, if 10000 <= number <= 30000:.


3
... questo genere di cose è in genere chiamato confronto concatenato .
Lupo,

30

Il tuo frammento di codice,

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

controlla effettivamente se il numero è maggiore sia di 10000 che di 30000.

Supponendo di voler verificare che il numero sia compreso tra 10000 e 30000, è possibile utilizzare il confronto degli intervalli Python:

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

Questa funzione di Python è ulteriormente descritta nella documentazione di Python .


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

8

Il problema con i confronti è che possono essere difficili da eseguire il debug quando si inserisce un punto >=dove dovrebbe esserci un<=

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

Python ti lascia semplicemente scrivere ciò che vuoi dire a parole

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

In Python3, devi usare rangeinvece di xrange.

modifica: le persone sembrano essere più interessate ai segni del microbench e alle fantastiche operazioni di concatenamento. La mia risposta riguarda la programmazione difensiva (meno superficie di attacco per i bug).

Come risultato di un'affermazione nei commenti, ho aggiunto il micro benchmark qui per 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 sei preoccupato per le prestazioni, puoi calcolare l'intervallo una volta

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

2
xrange è deprecato in Python 3, sfortunatamente.
apraetor

1
@apraetor, si usare range(10000, 30001)in Python3. Non crea un elenco
John La Rooy

3
@JBChouinard, hai assolutamente torto. xrangein Python2 o rangein Python3 hanno test di appartenenza. Provalo tu stesso se non ci credi. <=è solo più efficiente perché non crea un oggetto range. Entrambi i modi come O (1). Il punto è che l'OP stava cercando di farlo a modo tuo e ha finito con un bug . Il codice veloce che è sbagliato è peggio.
John La Rooy,

2
su un i5, (i) python 3.5:% timeit 5 nel range (10000, 30000) 1000 loop, meglio di 3: 451 µs per loop. % timeit 10000 <= 5 <= 30000 10000000 loop, meglio di 3: 59,4 ns per loop. questo è un fattore di oltre 7000
tback

1
@tback, se ci fosse una possibilità che fosse 7000 volte più lenta, non l'avrei suggerito. Forse potresti provare di nuovo a eseguire il test.
John La Rooy,

8

Definisci l'intervallo tra i numeri:

r = range(1,10)

Quindi usalo:

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

3
rangenon conta l'ultimo valore 10 nel tuo caso. range(1,11)è corretto, se devi confrontare tra 1 e 10
ikbel benabdessamad,

6

Esistono due modi per confrontare tre numeri interi e verificare se b è compreso tra a e c :

if a < b < c:
    pass

e

if a < b and b < c:
    pass

Il primo sembra più leggibile, ma il secondo corre più veloce .

Confrontiamo 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

inoltre, è possibile utilizzare l' intervallo , come suggerito prima, tuttavia è molto più lento.


0

Supponiamo che ci siano 3 numeri interi non negativi: a, b, e c. In termini matematici, se vogliamo determinare se cè compreso tra ae b, in modo inclusivo, possiamo usare questa formula:

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

o in Python:

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

Questo è sbagliato, prendi il semplice esempio a = 1, b = 2, c = 3 ba = 1 ca = 2 (ba) * (ca) = 1 * 2> = 0 Vero => 3 è compreso tra 1 e 2
Richard Ardelean

Ci scusiamo per l'errore che ho fatto. Ho modificato la mia risposta @RichardArdelean.
Anastasiya-Romanova

0

Volete che l'output stampi l'istruzione data se e solo se il numero è compreso tra 10.000 e 30.000.

Il codice dovrebbe essere;

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

3
Questa risposta è già stata suggerita. Cosa aggiunge la tua risposta alla domanda?
Jaideep Shekhar,

0

La condizione dovrebbe essere,

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

la ragione per l'uso number == 10000è che se il valore di numero è 50000 e se usiamo number >= 10000la condizione passerà, che non è quello che vuoi.


Ciò non funzionerà per 10001, ad esempio. Vuole numeri tra 10000 e 30000. La tua condizione funzionerà solo per il numero == 10000.
guerreiro
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.