2012-05-29 10 views
12

me he encontrado muchas veces, con las cosas que tengo que ser todo o al menos un equivalente a algo, y me gustaría escribir algo así:¿Cómo se usa O, Y en condicionales?

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

o

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

Si el número de cosas es pequeño, está bien, pero todavía no es elegante. Entonces, ¿hay una mejor manera de hacer un número significativo de cosas? Gracias.

+1

En este caso, ¿no le importa si sólo sólo sea uno fuera solo '1'? No necesita el primer cheque, solo necesita el cheque 'o'. – birryree

+1

Son ejemplos separados. – GiannisIordanou

+1

Primero se puede escribir 'a == 1 == b' –

Respuesta

28

Opción 1: cualquier/todo

Para el caso general, echar un vistazo a any y all:

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

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

También se puede utilizar cualquier iterable:

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

Opción 2: encadenamiento y en

Para su primer ejemplo, puede usar booleano Secuencia de operadores:

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

Para su segundo ejemplo se puede utilizar in:

if 1 in states: 

Opción 3: cualquier/todo ello sin un predicado

Si solo le importa si el valor es verdad, puede simplificar aún más:

if any(flags): 

if all(flags): 
+2

' 1 en [a, b, c, d] 'no es tan bueno; '1 en (a, b, c, d)'. Prefiera los literales de lista solo donde necesite una lista para el siguiente paso. – SingleNegationElimination

+1

Porque usar una lista donde podría usar una tupla anuncia falsamente un intento de hacer algo con la lista que no podría hacer con una tupla (es decir, mutar un elemento). –

+3

Las tuplas son un poco más baratas de hacer que las listas –

3

mira esto

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

donde A, B, C, D son todas las variables ...

0

me gusta esta forma de ser fácil de entender en 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  

Lienzo:

True 
False 

Entonces cond() puede ser tan complejo como sea necesario.

Puede suministrar un usuario puede llamar o utilizar el operator module una mayor flexibilidad:

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 

O aún más simple:

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, realmente odio que devuelva el valor * literal * booleano que acaba de determinarse en el bloque if. – ch3ka

+0

@ ch3ka: supongo que podría usar otra conversión que se adhiera a la sensación de verdadero y falso de Python. Me gustan los booleanos literales personalmente. Usted no? Supongo que puedes tener 'return t == v' o' return op (t, v) ' – dawg

+2

o simplemente' return t == v' ... –