整数が他の2つの整数の間にあるかどうかを判断しますか?


398

特定の整数が他の2つの整数の間にあるかどうかを判断するにはどうすればよいですか(たとえば、より大きい/等しい10000、より小さい/等しい30000)。

私は2.3 IDLEを使用していますが、これまでに試みたことが機能しません。

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

20
ブール演算子を確認してください。もちろん、30000より大きい場合は、10000より大きい数になります。細部を確認すると、はるかに多くの間違いを見つけることができます。
カイリ

2
比較は連鎖することができますdocs.python.org/2/reference/expressions.html#comparisons
theBuzzyCoder

6
Pls変更> = 30000から<= 30000
Badiboy

回答:


1046
if 10000 <= number <= 30000:
    pass

208
Pythonはとても素晴らしいです:)。冗長にするために、これは「間隔比較」と呼ばれます。
Matt Montag、2014

これとif number in range(10000, 30001)他のソリューションで示唆されている速度の違いは何ですか?さらに、のset代わりに使用すると、それは速くなりますか、遅くなりrangeますか?
Sung Cho

15
@MikeC間隔比較でnumberは、最初にと比較され10000ます。それよりも小さい場合10000、式はすぐに短絡され、2番目の比較はチェックされません。複雑さは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
パオロ・モレッティ

5
あなたのシェルで実行してみ@MikeC:> python -m timeit '10000 <= 10 <= 30000' > python -m timeit '10 in range(10000, 30001)' > python -m timeit '10 in set(range(10000, 30001))'
パオロ・モレッティ

3
python3.5.2のように見えますが、範囲はifステートメントよりも〜10倍遅く、範囲のチェック値に関して速度は一定です...したがって、関数のオーバーヘッドによる違いが最も考えられます。
amohr 2016年

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(またはxrangepython2で)ジェネレーターを返すので、繰り返しテストすることはできません。
yegle

24
これ4 in range(1,4)はFalseであることを覚えておくことが重要です。1 >= r <= 4
初心者

50
1.5 in rFalse3.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では非推奨です。
元弁護士、2016年

1
@apraetor、はいrange(10000, 30001)、Python3で使用します。それはリストを作成しません
John La Rooy

3
@JBChouinard、あなたは絶対に間違っています。xrangePython2またはrangePython3にはメンバーシップテストがあります。信じられない場合は、自分で試してみてください。<=範囲オブジェクトを作成しないため、効率が向上するだけです。O(1)と同じです。重要なのは、OP それを自分のやり方で行おうとしていて、バグが発生したことです。間違っている高速なコードはさらに悪い。
John La Rooy、2016年

2
i5、(i)python 3.5:%timeit 5 in range(10000、30000)1000 loops、best of 3:451 µs per loop %timeit 10000 <= 5 <= 30000 10000000ループ、最高3:ループあたり59.4 ns。それは7000以上の要因です
tback

1
@tback、それが7000倍遅い可能性があった場合、私はそれを提案しなかっただろう。おそらく、もう一度テストを実行してみてください。
John La Rooy、2016

8

数値間の範囲を定義します。

r = range(1,10)

次にそれを使用します:

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

3
rangeあなたの場合、最後の値10はカウントされません。 range(1,11)正解です。1と10を比較する必要がある場合
ikbel benabdessamad

6

3つの整数を比較しbacの間にあるかどうかを確認するには、2つの方法があります

if a < b < c:
    pass

そして

if a < b and b < c:
    pass

最初のものは読みやすいように見えますが、2番目のものはより速く実行されます

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非負の整数があると仮定しabc。私たちがどうかを判断したい場合は、数学的に言えば、c間にあるab、包括的、人はこの式を使用することができます。

(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の間です
Richardアルデリアン

私が間違えたのでごめんなさい。私の回答@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は、数値の値が50000であり、使用しnumber >= 10000た場合に条件が満たされるため、これは望ましいことではありません。


たとえば、これは10001では失敗します。彼は唯一の番号== 10000のために動作します10000および30000あなたの状態の間の数字を望んでいる
ゲレイロ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.