Đơn giản hóa so sánh xích


254

Tôi có một giá trị nguyên xvà tôi cần kiểm tra xem nó có nằm giữa a startendgiá trị không, vì vậy tôi viết các câu sau:

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

Tuyên bố này được gạch chân và chú giải công cụ cho tôi biết rằng tôi phải

đơn giản hóa so sánh xích

Theo như tôi có thể nói, sự so sánh đó đơn giản như họ đến. Tôi đã bỏ lỡ điều gì ở đây?


1
Nếu bạn nhận được một lời đề nghị từ tooltip, bạn có thể di chuột qua khu vực và nó cung cấp cho bạn một bóng đèn nhỏ. Bạn có thể nhấp vào nó và để nó tự động chèn thay đổi mà nó gợi ý. Vì vậy, bạn có thể thấy những gì nó nghĩ bạn nên làm (và bạn có thể Hoàn tác nếu bạn không thích nó).
Edward Ned Harvey

Câu trả lời:


432

Trong Python, bạn có thể "xâu chuỗi" các hoạt động so sánh chỉ có nghĩa là chúng "và" ed với nhau. Trong trường hợp của bạn, nó sẽ như thế này:

if start <= x <= end:

Tham khảo: https://docs.python.org/3/reference/expressions.html#comparisons


2
Cảm ơn, tôi không biết bạn có thể làm điều đó trong Python. Đã thực sự gãi đầu của tôi về điều này.
Brynn McCullagh

18
Man đây là cách mọi thứ nên được. Nhưng đến từ các ngôn ngữ khác, bạn quên mất lý tưởng của mình và thậm chí không nghĩ rằng, mọi thứ có thể là cách họ nên làm. Nhưng đây là lý do tại sao trăn rất tuyệt vời, chính xác là vì những điều như vậy :)
Hakaishin

Bạn có biết bất kỳ nguồn "chính thức" nào đề xuất kiểu xâu chuỗi khác không? Cái nào là Python "thành ngữ" hơn?
Ray

Tôi không biết, đôi khi tôi ước con trăn ném thêm lan can. x == y == z không thành công với ValueError khi x, y, z là chuỗi Pandas
BallpointBen

@BallpointBen: rất nhiều thứ không hoạt động theo cách bạn có thể mong đợi ở Pandas, thậm chí không x == y and y == z.
John Zwinck

12

Nó có thể được viết lại thành:

start <= x <= end:

Hoặc là:

r = range(start, end + 1) # (!) if integers
if x in r:
    ....

5
Phạm vi là một lựa chọn kém vì để bắt đầu và kết thúc lớn, bạn đang tạo một danh sách không cần thiết.
Burhan Khalid

1
@BurhanKhalid Thật vậy, nhưng tôi đoán nó đáng được đề cập cho OP.
Maroun

7
Trong python3, phạm vi xử lý " chứa " độc đáo, do đó không có danh sách nào được tạo.
JoshNahum

2
@MarounMaroun kể từ python 3, hàm phạm vi hoạt động giống như xrange trước đây, nó cũng đáng được đề cập
dvdvck

5
Để biết chi tiết về việc sử dụng if x in range(...), hãy xem " Tại sao là 1000000000000000 trong phạm vi (1000000000000001), quá nhanh trong Python 3? ".
Kevin J. Chase

-4

Đơn giản hóa mã

if start <= x <= end: # start x is between start and end 
# do stuff

9
Làm thế nào khác với câu trả lời này ?
GWigWam
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.