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?


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


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.