Uprość porównanie łańcuchowe

254

Mam wartość całkowitą xi muszę sprawdzić, czy zawiera się między a, starta endwięc piszę następujące instrukcje:

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

To oświadczenie zostaje podkreślone, a podpowiedź mówi mi, że muszę

uprościć porównanie łańcuchowe

O ile wiem, porównanie jest tak proste, jak tylko się da. Czego tu brakuje?

Brynn McCullagh
źródło
1
Jeśli otrzymasz podpowiedź z podpowiedzi, możesz najechać myszką na ten obszar, co da ci małą żarówkę. Możesz go kliknąć i automatycznie wstawić proponowaną zmianę. Możesz więc zobaczyć, co według Ciebie powinieneś robić (i możesz cofnąć, jeśli ci się nie podoba).
Edward Ned Harvey

Odpowiedzi:

432

W Pythonie możesz „porównywać” operacje porównania, co oznacza, że ​​są one „i” edytowane razem. W twoim przypadku wyglądałoby to tak:

if start <= x <= end:

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

John Zwinck
źródło
2
Dzięki, nie wiedziałem, że możesz to zrobić w Pythonie. Naprawdę drapałam się po głowie.
Brynn McCullagh
18
Człowieku, tak właśnie powinno być. Ale z innych języków zapominacie o swoich ideałach i nawet nie myślicie, że rzeczy mogą być takie, jakie powinny być. Ale właśnie dlatego python jest niesamowity, właśnie z powodu takich rzeczy :)
Hakaishin
Czy znasz jakieś „oficjalne” źródła, które zalecają styl łańcuchowy w porównaniu do innych? Który z nich jest bardziej „idiomatycznym” Pythonem?
Ray
Nie wiem, czasami żałuję, że pyton nie zwymiotował więcej barier. x == y == z kończy się błędem ValueError, gdy x, y, z są seriami Pandas
BallpointBen
@BallpointBen: wiele rzeczy nie działa tak, jak można się spodziewać w Pandach, nawet x == y and y == z.
John Zwinck
12

Można go przepisać jako:

start <= x <= end:

Lub:

r = range(start, end + 1) # (!) if integers
if x in r:
    ....
Maroun
źródło
5
Zakres jest złym wyborem, ponieważ na początku i na końcu tworzysz niepotrzebną listę.
Burhan Khalid
1
@BurhanKhalid Rzeczywiście, ale myślę, że warto wspomnieć o OP.
Maroun
7
W python3 uchwyty zakresu „ zawierają ” ładnie, więc nie jest generowana lista.
JoshNahum
2
@MarounMaroun od Pythona 3, funkcja zakresu zachowuje się jak dawny xrange, warto również wspomnieć
dvdvck
5
Aby uzyskać szczegółowe informacje na temat używania if x in range(...), zobacz „ Dlaczego„ 1000000000000000 w zakresie (1000000000000001) ”jest tak szybki w Pythonie 3? ”.
Kevin J. Chase
-4

Uproszczenie kodu

if start <= x <= end: # start x is between start and end 
# do stuff
Thomson Lukose
źródło
9
Czym różni się to od tej odpowiedzi?
GWigWam