Tentukan Apakah Integer Apakah Antara Dua Integer Lainnya?

399

Bagaimana cara menentukan apakah bilangan bulat yang diberikan adalah antara dua bilangan bulat lainnya (misalnya lebih besar dari / sama dengan 10000dan kurang dari / sama dengan 30000)?

Saya menggunakan 2.3 IDLE dan apa yang saya coba sejauh ini tidak berhasil:

if number >= 10000 and number >= 30000:
    print ("you have to pay 5% taxes")
Anak biasa
sumber
20
Periksa operator boolean Anda, tentu saja jumlahnya akan lebih besar dari 10.000 jika lebih besar dari 30000. Lihat detail kecilnya dan Anda akan mendapatkan lebih banyak kesalahan.
Kaili
2
Perbandingan dapat dirantai docs.python.org/2/reference/expressions.html#comparisons
theBuzzyCoder
6
Tolong ubah> = 30000 menjadi <= 30000
Badiboy

Jawaban:

1047
if 10000 <= number <= 30000:
    pass
Paolo Moretti
sumber
208
Python sangat bagus :). Dan menjadi redundan: ini disebut "perbandingan interval."
Matt Montag
Apa perbedaan kecepatan antara ini dan if number in range(10000, 30001)seperti yang disarankan oleh solusi lain? Selain itu, apakah lebih cepat atau lebih lambat saat menggunakan, setbukan range?
Sung Cho
15
@MikeC Dengan perbandingan interval numberlebih dulu dibandingkan dengan 10000. Jika kurang dari 10000ekspresi langsung hubung singkat dan perbandingan kedua tidak diperiksa. Kompleksitasnya O(1). in range(0, n)sebagai gantinya menghasilkan seluruh urutan angka dan kemudian beralih melaluinya. Kompleksitasnya O(n). Kompleksitasnya in set(range(0, n))masihO(n) karena membangun satu set memiliki kompleksitas waktu O(n) ics.uci.edu/ ~ patis
Paolo Moretti
5
@MikeC Cobalah untuk menjalankan di shell Anda: > 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
seperti di python3.5.2, range ~ 10x lebih lambat daripada pernyataan if, dengan kecepatan konstan dalam hal range check value ... dengan demikian kemungkinan besar perbedaan karena fungsi overhead.
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
sumber
4
Wow saya selalu berpikir range(atau xrangedalam python2) mengembalikan generator sehingga Anda tidak dapat berulang kali mengujinya.
yegle
24
Penting untuk jadi diingat bahwa 4 in range(1,4)adalah False. Jadi lebih baik gunakan 1 >= r <= 4karena menghindari kemungkinan kesalahan oleh pendatang baru
tripplet
50
1.5 in rmemberi False, bahkan dalam 3.4. Jawaban ini hanya baik untuk bilangan bulat.
jpmc26
9
@ tripplet, Anda membuat kesalahan yang sama dengan OP !, Seharusnya1 <= r <= 4
John La Rooy
8
(1.) kinerja buruk (seperti yang orang lain tunjukkan sintaks ini terlihat bagus tetapi bisa memakan waktu lama untuk mengeksekusi karena itu adalah O (n) operasi vs if a <= x <= b...) (2.) tidak bekerja untuk floattipe (3) .) tes jangkauan tidak termasuk ... begitu banyak pengembang dapat memperkenalkan bug karena mereka mengharapkan jangkauan inklusif
Trevor Boyd Smith
52

Operator Anda salah. Seharusnya if number >= 10000 and number <= 30000:. Selain itu, Python memiliki singkatan untuk hal semacam ini if 10000 <= number <= 30000:,.

Silas Ray
sumber
3
... hal semacam ini biasanya disebut perbandingan berantai .
Wolf
30

Cuplikan kode Anda,

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

sebenarnya memeriksa apakah angkanya lebih besar dari 10000 dan 30000.

Dengan asumsi Anda ingin memeriksa bahwa angka tersebut berada dalam kisaran 10000 - 30000, Anda dapat menggunakan perbandingan interval Python:

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

Fitur Python ini dijelaskan lebih lanjut dalam dokumentasi Python .

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

Masalah dengan perbandingan adalah bahwa mereka bisa sulit untuk di-debug ketika Anda meletakkan di >=mana seharusnya ada<=

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

Python memungkinkan Anda menulis apa yang Anda maksud dengan kata-kata

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

Di Python3, Anda harus menggunakan rangebukanxrange .

sunting: Orang-orang tampaknya lebih peduli dengan tanda microbench dan bagaimana operasi chaining yang keren. Jawaban saya adalah tentang program defensif (kurang permukaan serangan untuk bug).

Sebagai hasil dari klaim di komentar, saya telah menambahkan patokan mikro di sini untuk 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

Jika Anda khawatir tentang kinerja, Anda bisa menghitung rentang sekali

$ 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
sumber
2
xrange sudah usang dalam Python 3, sayangnya.
apraetor
1
@apraetor, ya gunakan range(10000, 30001)di Python3. Itu tidak membuat daftar
John La Rooy
3
@ JBChouinard, Anda benar-benar salah. xrangedi Python2, atau rangePython3 memiliki tes keanggotaan. Cobalah sendiri jika Anda tidak percaya. <=hanya lebih efisien karena tidak membuat objek jangkauan. Keduanya sama seperti O (1). Intinya adalah OP itu mencoba untuk melakukannya dengan cara Anda dan berakhir dengan bug . Kode cepat yang salah lebih buruk.
John La Rooy
2
pada i5, (i) python 3.5:% timeit 5 dalam kisaran (10000, 30000) 1000 loop, terbaik dari 3: 451 μs per loop. % timeit 10000 <= 5 <= 30000 10000000 loop, terbaik dari 3: 59,4 ns per loop. itu faktor lebih dari 7000
mundur
1
@ balik, Jika ada kemungkinan itu 7000 kali lebih lambat, saya tidak akan menyarankan itu. Mungkin Anda bisa mencoba menjalankan tes lagi.
John La Rooy
8

Tentukan kisaran antara angka:

r = range(1,10)

Kemudian gunakan:

if num in r:
    print("All right!")
joandiar91
sumber
3
rangetidak menghitung nilai terakhir 10 dalam kasus Anda. range(1,11)benar, jika Anda perlu membandingkan antara 1 dan 10
ikbel benabdessamad
6

Ada dua cara untuk membandingkan tiga bilangan bulat dan memeriksa apakah b adalah antara a dan c :

if a < b < c:
    pass

dan

if a < b and b < c:
    pass

Yang pertama terlihat lebih mudah dibaca, tetapi yang kedua berjalan lebih cepat .

Mari kita bandingkan menggunakan 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
>>>

dan menggunakan 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

juga, Anda dapat menggunakan rentang , seperti yang disarankan sebelumnya, namun jauh lebih lambat.

a_bridges
sumber
0

Misalkan ada 3 bilangan bulat non-negatif: a, b, dan c. Secara matematis, jika kita ingin menentukan apakah cada di antara adan b, secara inklusif, seseorang dapat menggunakan rumus ini:

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

atau dengan Python:

> print((c - a) * (b - c) >= 0)
True
Anastasiya-Romanova 秀
sumber
Ini salah, ambil contoh sederhana a = 1, b = 2, c = 3 ba = 1 ca = 2 (ba) * (ca) = 1 * 2> = 0 Benar => 3 adalah antara 1 dan 2
Richard Ardelean
Maaf atas kesalahan yang saya buat. Saya telah mengedit jawaban saya @RichardArdelean.
Anastasiya-Romanova 秀
0

Anda ingin output mencetak pernyataan yang diberikan jika dan hanya jika jumlahnya turun antara 10.000 dan 30.000.

Kode seharusnya;

if number >= 10000 and number <= 30000:
    print("you have to pay 5% taxes")
Steffny Marif Bill
sumber
3
Jawaban ini sudah disarankan. Apa yang ditambahkan jawaban Anda ke pertanyaan?
Jaideep Shekhar
0

Syaratnya harus,

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

alasan untuk menggunakan number == 10000adalah bahwa jika nilai angka adalah 50.000 dan jika kami menggunakan number >= 10000kondisi akan berlalu, yang bukan yang Anda inginkan.

Sadaf
sumber
Ini akan gagal untuk 10001, misalnya. Dia menginginkan angka antara 10.000 dan 30000. Kondisi Anda hanya akan berfungsi untuk angka == 10000.
guerreiro