Sederhanakan Perbandingan Dirantai

254

Saya memiliki nilai integer x, dan saya perlu memeriksa apakah itu antara a startdan endnilai, jadi saya menulis pernyataan berikut:

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

Pernyataan ini digarisbawahi, dan tooltip memberitahu saya bahwa saya harus

menyederhanakan perbandingan rantai

Sejauh yang saya tahu, perbandingan itu sesederhana mungkin. Apa yang saya lewatkan di sini?

Brynn McCullagh
sumber
1
Jika Anda mendapatkan saran dari tooltip, Anda dapat mengarahkan mouse ke area tersebut dan memberi Anda sedikit bola lampu. Anda dapat mengkliknya dan secara otomatis memasukkan perubahan yang disarankan. Jadi Anda dapat melihat apa yang menurutnya harus Anda lakukan (dan Anda dapat Membatalkan jika Anda tidak menyukainya).
Edward Ned Harvey

Jawaban:

432

Dalam Python Anda dapat "rantai" operasi perbandingan yang hanya berarti mereka "dan" diedit bersama. Dalam kasus Anda, akan seperti ini:

if start <= x <= end:

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

John Zwinck
sumber
2
Terima kasih, saya tidak tahu Anda bisa melakukannya dengan Python. Benar-benar menggaruk-garuk kepala yang satu ini.
Brynn McCullagh
18
Man begini yang seharusnya terjadi. Tetapi datang dari bahasa lain Anda melupakan cita-cita Anda dan bahkan tidak berpikir, bahwa hal-hal bisa menjadi cara mereka seharusnya. Tapi inilah mengapa python luar biasa, justru karena hal-hal seperti itu :)
Hakaishin
Apakah Anda tahu ada sumber "resmi" yang merekomendasikan gaya dirantai di atas yang lain? Mana yang lebih Python "idiomatik"?
Ray
Saya tidak tahu, kadang-kadang saya berharap python melemparkan lebih banyak pagar. x == y == z gagal dengan ValueError ketika x, y, z adalah seri Pandas
BallpointBen
@BallpointBen: banyak hal tidak bekerja seperti yang Anda harapkan di Panda, bahkan tidak x == y and y == z.
John Zwinck
12

Itu dapat ditulis ulang sebagai:

start <= x <= end:

Atau:

r = range(start, end + 1) # (!) if integers
if x in r:
    ....
Maroun
sumber
5
Rentang ini adalah pilihan yang buruk karena untuk awal dan akhir yang besar Anda membuat daftar yang tidak perlu.
Burhan Khalid
1
@ BurhanKhalid Memang, tapi saya kira itu layak disebut untuk OP.
Maroun
7
Di python3, rentang menangani " berisi " dengan baik, jadi tidak ada daftar yang dihasilkan.
JoshNahum
2
@MarounMaroun sejak python 3, fungsi rentang berperilaku seperti xrange sebelumnya, juga layak disebutkan
dvdvck
5
Untuk detail tentang penggunaan if x in range(...), lihat " Mengapa" 1000000000000000 dalam jangkauan (1000000000000001) "begitu cepat di Python 3? ".
Kevin J. Chase
-4

Penyederhanaan kode

if start <= x <= end: # start x is between start and end 
# do stuff
Thomson Lukose
sumber
9
Bagaimana ini berbeda dari jawaban ini ?
GWigWam