2012-04-08 35 views
9

Tôi thường kết thúc việc viết mã nhưTrong Python một số cách khác để viết một nếu x == 1 hoặc x == 5 hoặc x == 10 ...?

if x == 1 or x == 5 or x == 10 or x == 22 : 
    pass 

Trong tiếng Anh có vẻ như không cần thiết để giữ lặp lại x, là có một cách dễ dàng hơn hoặc ngắn hơn để viết ra một tuyên bố nếu-như thế?

Có thể kiểm tra sự tồn tại của x giá trị trong một bộ tóan (1, 5, 10, 22,) hoặc cái gì đó?

+2

Yeah, 'nếu x trong [1, 50, 10, 22]' là đơn giản để viết và đọc –

Trả lời

14

Có, bạn là đúng - hoặc trong một bộ hoặc (nếu kiểm tra này được thực hiện nhiều lần) trong một bộ.

Vì vậy, hoặc làm

if x in (1, 5, 10, 22): 
    pass 

hoặc, nếu bạn làm việc kiểm tra này thường xuyên và số lượng giá trị là đủ lớn,

myset = set((1, 5, 10, 22)) 

[...] 

if x in myset: 
    pass 

Những thứ myset là hữu ích hơn, giá trị hơn bạn muốn kiểm tra. 4 giá trị là khá ít, vì vậy bạn có thể giữ nó đơn giản. 400 giá trị và bạn nên sử dụng tập hợp ...

Một khía cạnh khác, như được Marcin chỉ ra, là băm cần thiết để tra cứu trong tập hợp có thể đắt hơn tìm kiếm danh sách hoặc bộ giá trị tuyến tính cho giá trị mong muốn.

+7

Trong Python 2.7/3. *, bạn cũng có thể sử dụng một bộ chữ: '{1, 5, 10, 22}'. Trong Python 3.2+, điều này thậm chí còn tối ưu hóa để sử dụng 'frozenset' một cách minh bạch nếu bạn chỉ thực hiện kiểm tra' in' (mặc dù không phải là bạn đang lưu kết quả trong một biến). – Dougal

+2

+1 cho đề xuất đầu tiên, nhưng tôi phải đồng ý với Dougal rằng bạn nên sử dụng cú pháp mới nếu có thể. –

+1

'set ((1, 5, 10, 22))' hoạt động trong nhiều phiên bản hơn '{1, 5, 10, 22}' và thực sự không phải là tất cả những IMHO dễ đọc hơn. – martineau

6

Bạn có thể sử dụng in với một bộ sưu tập:

if x in [1, 5, 10, 22]: 
    # etc... 

if x in {1, 5, 10, 22}: # New syntax for creating sets 
    # etc... 

Lưu ý rằng điều này sẽ tạo ra một danh sách mới mỗi khi dòng thực thi. Nếu hiệu quả là một mối quan tâm, chỉ tạo bộ sưu tập một lần và sử dụng lại nó.

+0

... hoặc một bộ, như tôi đã viết. Không quá khẩn cấp với 4 giá trị, cấp bách hơn với 40, 400 hoặc 4000 ... – glglgl

+0

Tuy nhiên, một bộ tuple phổ biến hơn và một bộ thậm chí còn đẹp hơn cả việc giảm giá hiệu suất có (tùy thuộc vào phiên bản Python trong trường hợp sau) . – delnan

+0

@glglgl: Ồ vâng, một bộ là ý tưởng hay hơn. Tuple thường được sử dụng, nhưng tôi nghĩ nó không phải là loại ngữ nghĩa thích hợp nhất. –

2

Nếu quý vị cần thực hiện tốt và sẽ lặp lại cùng một so sánh nhiều lần, sử dụng một bộ:

s = frozenset([1, 5, 10, 22]) # at the beginning 

if x in s: # in your code 
    pass 
+3

Tất nhiên, đối với dữ liệu nhỏ, bộ tuple có thể nhanh hơn (không cần băm, cấu trúc dữ liệu đơn giản hơn, không có nguy cơ va chạm) và trong Python 3.2, bạn sẽ được tối ưu hóa miễn phí (thậm chí tốt hơn, frozenset chỉ được tạo một lần) nếu bạn sử dụng một chữ được đặt trong điều kiện. Ngoài ra, các điều khoản và điều kiện tương tự như với tất cả các vấn đề về hiệu suất: (1) Đo lường thời tiết bạn cần để tối ưu hóa điều này. (2) Làm lại # 2! (3) Thực sự chắc chắn? (4) Tốt thôi! Đi thu thập lựa chọn của bạn và chuẩn cho họ tốt. – delnan

+0

Vì vậy, tạo một 'frozenset', nhanh hơn việc tạo một' danh sách' thông thường, và một 'bộ'? – George

Các vấn đề liên quan