2012-05-29 22 views
12

Tôi đã tìm thấy bản thân mình nhiều lần, với điều mà tôi cần phải được tất cả hoặc ít nhất một bằng một cái gì đó, và tôi sẽ viết một cái gì đó như thế:Bạn sử dụng OR, AND trong điều kiện như thế nào?

if a==1 and b==1: 
    do something 

hoặc

if a==1 or b==1: 
    do something 

Nếu số lượng của mọi thứ là nhỏ ok của nó, nhưng nó vẫn không thanh lịch. Vì vậy, là có một cách tốt hơn cho một số lượng đáng kể của sự vật, để làm điều trên?

+1

Trong trường hợp này, bạn sẽ không chỉ chỉ quan tâm nếu một trong hai là chỉ '1'? Bạn không cần kiểm tra đầu tiên, bạn chỉ cần kiểm tra 'hoặc'. – birryree

+1

Đó là những ví dụ riêng biệt. – GiannisIordanou

+1

Đầu tiên có thể được viết 'a == 1 == b' –

Trả lời

28

Lựa chọn 1: bất kỳ/tất cả

Đối với trường hợp chung, có một cái nhìn tại anyall:

if all(x == 1 for x in a, b, c, d): 

if any(x == 1 for x in a, b, c, d): 

Bạn cũng có thể sử dụng bất kỳ iterable:

if any(x == 1 for x in states): 

Tùy chọn 2 - chuỗi và trong

Ví dụ đầu tiên của bạn, bạn có thể sử dụng boolean hành chaining:

if a == b == c == d == 1: 

Ví dụ thứ hai của bạn, bạn có thể sử dụng in:

if 1 in states: 

Lựa chọn 3: bất kỳ/tất cả mà không một vị

Nếu bạn chỉ quan tâm liệu giá trị có đúng hay không, bạn có thể đơn giản hóa thêm:

if any(flags): 

if all(flags): 
+2

'1 trong [a, b, c, d]' không phải là quá lớn; '1 trong (a, b, c, d)'. Chỉ ưu tiên các danh sách chữ cái mà bạn cần một danh sách cho bước tiếp theo. – SingleNegationElimination

+1

Bởi vì sử dụng một danh sách nơi bạn có thể sử dụng một bộ quảng cáo giả mạo một ý định để làm một cái gì đó với danh sách mà bạn không thể làm với một tuple (cụ thể là, thay đổi một phần tử). –

+3

tuples khá rẻ hơn một chút so với danh sách quá –

3

Kiểm tra này ra

if all(x >= 2 for x in (A, B, C, D)): 

trong đó A, B, C, D là tất cả các biến ...

0

Tôi thích hình thức này như là dễ hiểu bằng Python

def cond(t,v): 
    return t == v 

a=1 
b=3  
tests=[(a,1),(b,2)] 

print any(cond(t,v) for t,v in tests) # eq to OR 
print all(cond(t,v) for t,v in tests) # eq to AND  

Prints:

True 
False 

Sau đó, cond() có thể phức tạp nếu cần.

Bạn có thể cung cấp một người sử dụng có thể được gọi hoặc sử dụng operator module cho linh hoạt hơn:

import operator 

def condOP(t,v,op=operator.eq): 
    return op(t,v) 

a=1 
b=3  
tests=[(a,1,operator.eq),(b,2,operator.gt)] 

print any(condOP(*t) for t in tests) # eq to OR 
print all(condOP(*t) for t in tests) # eq to AND 

Hoặc thậm chí đơn giản hơn:

tests=[(a,1,operator.eq),(b,2,operator.gt)] 

print any(func(t,v) for t,v,func in tests) # eq to OR 
print all(func(t,v) for t,v,func in tests) # eq to AND  
+3

-0, tôi thực sự ghét rằng bạn trả về giá trị boolean * theo nghĩa đen mà chỉ được xác định trong khối nếu. – ch3ka

+0

@ ch3ka: Tôi cho rằng bạn có thể sử dụng một chuyển đổi khác tuân thủ ý nghĩa của Python về đúng và sai. Tôi thích cá nhân boolean. Bạn không? Tôi đoán bạn có thể có 'return t == v' hoặc' return op (t, v) ' – dawg

+2

hoặc chỉ' return t == v' ... –

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