Bestimmen Sie, ob eine Ganzzahl zwischen zwei anderen Ganzzahlen liegt?

398

Wie bestimme ich, ob eine bestimmte Ganzzahl zwischen zwei anderen Ganzzahlen liegt (z. B. größer als / gleich 10000und kleiner als / gleich 30000)?

Ich verwende 2.3 IDLE und was ich bisher versucht habe, funktioniert nicht:

if number >= 10000 and number >= 30000:
    print ("you have to pay 5% taxes")
Durchschnittliches Kind
quelle
20
Überprüfen Sie Ihre booleschen Operatoren. Natürlich ist eine Zahl größer als 10000, wenn sie größer als 30000 ist. Wenn Sie sich die kleinen Details ansehen, werden Sie weitaus mehr Fehler feststellen.
Kaili
2
Vergleiche können verkettet werden docs.python.org/2/reference/expressions.html#comparisons
theBuzzyCoder
6
Bitte ändern Sie> = 30000 zu <= 30000
Badiboy

Antworten:

1045
if 10000 <= number <= 30000:
    pass
Paolo Moretti
quelle
208
Python ist so schön :). Und um redundant zu sein: Dies wird als "Intervallvergleich" bezeichnet.
Matt Montag
Was ist der Geschwindigkeitsunterschied zwischen diesem und if number in range(10000, 30001)dem, was von einer anderen Lösung vorgeschlagen wird? Ist es außerdem schneller oder langsamer, wenn es setanstelle von verwendet wird range?
Sung Cho
15
@MikeC Mit dem Intervall numberwird zunächst der Vergleich verglichen 10000. Wenn es kleiner als 10000der Ausdruck ist, wird er sofort kurzgeschlossen und der zweite Vergleich wird nicht überprüft. Die Komplexität ist O(1). in range(0, n)generiert stattdessen die gesamte Zahlenfolge und durchläuft sie dann. Die Komplexität ist O(n). Die Komplexität von in set(range(0, n))ist immer noch, O(n)weil das O(n) Erstellen
Paolo Moretti
5
@ MikeC Versuchen Sie, in Ihrer Shell zu laufen:> 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
sieht aus wie in python3.5.2, der Bereich ist ~ 10x langsamer als die if-Anweisung, mit einer Geschwindigkeitskonstante in Bezug auf den Bereichsprüfwert ... daher höchstwahrscheinlich ein Unterschied aufgrund des Funktionsaufwands.
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
quelle
4
Wow, ich habe immer gedacht range(oder xrangein Python2), dass ein Generator zurückgegeben wird, sodass Sie ihn nicht wiederholt testen können.
Yegle
24
Es ist wichtig zu bedenken, dass dies 4 in range(1,4)falsch ist. Verwenden 1 >= r <= 4Sie also besser das, da es mögliche Fehler von Neulingen vermeidet
Tripplet
50
1.5 in rgibt Falseauch in 3.4. Diese Antwort ist nur für ganze Zahlen gut.
jpmc26
9
@ Tripplet, Sie haben den gleichen Fehler wie das OP gemacht! Es sollte sein1 <= r <= 4
John La Rooy
8
(1.) schlechte Leistung (wie andere darauf hingewiesen haben, sieht diese Syntax gut aus , die Ausführung kann jedoch lange dauern, da es sich um O (n) -Operationen im Vergleich zu if a <= x <= b...) handelt. (2.) funktioniert nicht für floatTypen (3) .) Der Reichweitentest ist nicht inklusive ... so viele Entwickler können Fehler einführen, weil sie eine inklusive Reichweite erwarten
Trevor Boyd Smith
52

Ihr Operator ist falsch. Sollte sein if number >= 10000 and number <= 30000:. Zusätzlich hat Python eine Abkürzung für diese Art von Dingen if 10000 <= number <= 30000:.

Silas Ray
quelle
3
... so etwas nennt man normalerweise verketteten Vergleich .
Wolf
30

Ihr Code-Snippet,

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

prüft tatsächlich, ob die Anzahl größer als 10000 und 30000 ist.

Angenommen, Sie möchten überprüfen, ob die Zahl im Bereich von 10000 bis 30000 liegt, können Sie den Python-Intervallvergleich verwenden:

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

Diese Python-Funktion wird in der Python-Dokumentation näher beschrieben .

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

Das Problem bei Vergleichen ist, dass es schwierig sein kann, sie zu debuggen, wenn Sie eine setzen, >=wo es eine geben sollte<=

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

Mit Python können Sie einfach schreiben, was Sie in Worten meinen

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

In Python3 müssen Sie rangeanstelle von verwenden xrange.

Bearbeiten: Die Leute scheinen sich mehr mit Mikrobench-Markierungen und den coolen Verkettungsvorgängen zu beschäftigen. Meine Antwort bezieht sich auf defensive (weniger Angriffsfläche für Fehler) Programmierung.

Aufgrund einer Behauptung in den Kommentaren habe ich hier den Mikro-Benchmark für Python3.5.2 hinzugefügt

$ 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

Wenn Sie sich Sorgen um die Leistung machen, können Sie den Bereich einmal berechnen

$ 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
quelle
2
xrange ist in Python 3 leider veraltet.
Apraetor
1
@apraetor, ja range(10000, 30001)in Python3 verwenden. Es wird keine Liste erstellt
John La Rooy
3
@JBChouinard, du bist absolut falsch. xrangein Python2 oder rangein Python3 haben Mitgliedschaftstests. Probieren Sie es selbst aus, wenn Sie nicht glauben. <=ist nur effizienter, weil es kein Bereichsobjekt erstellt. Beides als O (1). Der Punkt ist der OP wurde versucht , es auf deine Weise zu tun , und mit einem Fehler endete . Schneller Code, der falsch ist, ist schlimmer.
John La Rooy
2
auf einem i5 (i) Python 3,5:% timeit 5 im Bereich (10000, 30000) 1000 Schleifen, am besten 3: 451 µs pro Schleife. % timeit 10000 <= 5 <= 30000 10000000 Schleifen, am besten 3: 59,4 ns pro Schleife. das ist ein Faktor von über 7000
tback
1
@tback, Wenn es eine Chance gäbe, dass es 7000 mal langsamer wäre, hätte ich es nicht vorgeschlagen. Vielleicht könnten Sie versuchen, den Test erneut auszuführen.
John La Rooy
8

Definieren Sie den Bereich zwischen den Zahlen:

r = range(1,10)

Dann benutze es:

if num in r:
    print("All right!")
joandiar91
quelle
3
rangezählt in Ihrem Fall nicht den letzten Wert 10 . range(1,11)ist richtig, wenn Sie zwischen 1 und 10 vergleichen müssen
ikbel benabdessamad
6

Es gibt zwei Möglichkeiten , drei Ganzzahlen zu vergleichen und zu überprüfen, ob b zwischen a und c liegt :

if a < b < c:
    pass

und

if a < b and b < c:
    pass

Der erste sieht besser lesbar aus, der zweite läuft schneller .

Vergleichen wir mit 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
>>>

und mit 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

Sie können auch die Reichweite verwenden , wie zuvor vorgeschlagen, sie ist jedoch viel langsamer.

a_bridges
quelle
0

Angenommen , es gibt 3 nicht negative ganze Zahlen: a, b, und c. Mathematisch gesehen kann man diese Formel verwenden , wenn wir feststellen wollen, ob czwischen aund beinschließlich liegt:

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

oder in Python:

> print((c - a) * (b - c) >= 0)
True
Anastasiya-Romanova 秀
quelle
Dies ist falsch, nehmen Sie das einfache Beispiel a = 1, b = 2, c = 3 ba = 1 ca = 2 (ba) * (ca) = 1 * 2> = 0 True => 3 liegt zwischen 1 und 2
Richard Ardelean
Entschuldigung für den Fehler, den ich gemacht habe. Ich habe meine Antwort @RichardArdelean bearbeitet.
Anastasiya-Romanova
0

Sie möchten, dass die Ausgabe die angegebene Anweisung genau dann druckt, wenn die Anzahl zwischen 10.000 und 30.000 liegt.

Code sollte sein;

if number >= 10000 and number <= 30000:
    print("you have to pay 5% taxes")
Steffny Marif Bill
quelle
3
Diese Antwort wurde bereits vorgeschlagen. Was fügt Ihre Antwort der Frage hinzu?
Jaideep Shekhar
0

Die Bedingung sollte sein,

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

Grund für die Verwendung number == 10000ist, dass wenn der Wert der Zahl 50000 ist und wir number >= 10000die Bedingung erfüllen, dies nicht das ist, was Sie wollen.

Sadaf
quelle
Dies schlägt jedoch beispielsweise für 10001 fehl. Er möchte Zahlen zwischen 10000 und 30000. Ihr Zustand funktioniert nur für die Nummer == 10000.
Guerreiro