Vereinfachen Sie den verketteten Vergleich

254

Ich habe einen ganzzahligen Wert xund muss überprüfen, ob er zwischen a startund endWerten liegt. Daher schreibe ich die folgenden Anweisungen:

if x >= start and x <= end:
    # do stuff

Diese Aussage wird unterstrichen und der Tooltip sagt mir, dass ich muss

vereinfachen Sie den verketteten Vergleich

Soweit ich das beurteilen kann, ist dieser Vergleich so einfach wie sie kommen. Was habe ich hier vermisst?

Brynn McCullagh
quelle
1
Wenn Sie einen Vorschlag aus dem Tooltip erhalten, können Sie mit der Maus über den Bereich fahren und erhalten eine kleine Glühbirne. Sie können darauf klicken und die vorgeschlagene Änderung automatisch einfügen lassen. So können Sie sehen, was Sie tun sollten (und Sie können rückgängig machen, wenn es Ihnen nicht gefällt).
Edward Ned Harvey

Antworten:

432

In Python können Sie Vergleichsoperationen "verketten", was nur bedeutet, dass sie "und" zusammen sind. In Ihrem Fall wäre es so:

if start <= x <= end:

Referenz: https://docs.python.org/3/reference/expressions.html#comparisons

John Zwinck
quelle
2
Danke, ich wusste nicht, dass Sie das in Python tun können. Kratzte mir wirklich am Kopf.
Brynn McCullagh
18
Mann so sollten die Dinge sein. Aber wenn Sie aus anderen Sprachen kommen, vergessen Sie Ihre Ideale und denken nicht einmal, dass die Dinge so sein könnten, wie sie sein sollten. Aber das ist, warum Python erstaunlich ist, genau wegen solcher Dinge :)
Hakaishin
Kennen Sie "offizielle" Quellen, die den verketteten Stil dem anderen vorziehen? Welches ist "idiomatischer" Python?
Ray
Ich weiß nicht, manchmal wünschte ich, Python hätte mehr Leitplanken hochgeworfen. x == y == z schlägt mit einem ValueError fehl, wenn x, y, z Pandas-Serien sind
BallpointBen
@BallpointBen: Viele Dinge funktionieren nicht so, wie Sie es von Pandas erwarten, nicht einmal x == y and y == z.
John Zwinck
12

Es kann wie folgt umgeschrieben werden:

start <= x <= end:

Oder:

r = range(start, end + 1) # (!) if integers
if x in r:
    ....
Maroun
quelle
5
Der Bereich ist eine schlechte Wahl, da Sie für große Starts und Endes eine unnötige Liste erstellen.
Burhan Khalid
1
@ BurhanKhalid In der Tat, aber ich denke, es ist erwähnenswert für OP.
Maroun
7
In Python3 " enthält " Bereichshandles gut, sodass keine Liste generiert wird.
JoshNahum
2
@MarounMaroun seit Python 3, Range-Funktion verhält sich wie früher xrange, es ist auch erwähnenswert
dvdvck
5
Einzelheiten zur Verwendung von if x in range(...)finden Sie unter " Warum ist" 1000000000000000 in Reichweite (1000000000000001) "in Python 3 so schnell? ".
Kevin J. Chase
-4

Vereinfachung des Codes

if start <= x <= end: # start x is between start and end 
# do stuff
Thomson Lukose
quelle
9
Wie unterscheidet sich das von dieser Antwort?
GWigWam