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?


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


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:
    ....

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.