2010-09-09 20 views
24

Tengo una lista de booleanos que me gustaría combinar lógicamente usando y/o. Las operaciones ampliadas serían:¿Cuál es la forma más 'pitónica' de combinar lógicamente una lista de booleanos?

vals = [True, False, True, True, True, False] 

# And-ing them together 
result = True 
for item in vals: 
    result = result and item 

# Or-ing them together 
result = False 
for item in vals: 
    result = result or item 

¿Hay ingeniosa de una sola línea para cada uno de los anteriores?

+0

relacionada, aunque no obvia: http://stackoverflow.com/questions/3570624/does-pythons-reduce-short-circuit –

Respuesta

70

Ver all(iterable):

Volver True si todos los elementos de la iterable son verdaderas (o si el iterables está vacía).

Y any(iterable):

Volver True si cualquier elemento del iterables es cierto. Si el iterable está vacío, devuelva False.

+1

Sí, exactamente la respuesta correcta, 1! –

+1

Muchas gracias! Busqué en Google como loco antes de preguntar, y no encontré nada. – BobC

5

La mejor manera de hacerlo es con las funciones any() y all().

vals = [True, False, True, True, True] 
if any(vals): 
    print "any() reckons there's something true in the list." 
if all(vals): 
    print "all() reckons there's no non-True values in the list." 
if any(x % 4 for x in range(100)): 
    print "One of the numbers between 0 and 99 is divisible by 4." 
+0

Mi lista booleana es generada por una lista de comprensión en otra lista. Ahora puedo envolverlos a todos juntos. ¡Bonito! – BobC

+0

De acuerdo, si ese es el caso, puede convertirlo en una expresión generadora: – Jerub

1

Demostrando la respuesta de NullUserException.

In [120]: a 
Out[120]: 
array([[ True, True, True, True], 
     [ True, True, True, True], 
     [ True, True, True, True], 
     [ True, True, True, True], 
     [ True, True, True, True]], dtype=bool) 

In [121]: a.all() 
Out[121]: True 

In [122]: b 
Out[122]: 
array([[False, True, True, True], 
     [ True, True, True, True], 
     [ True, True, True, True], 
     [ True, True, True, True], 
     [ True, True, True, True]], dtype=bool) 

In [123]: b.all() 
Out[123]: False 

In [124]: b.any() 
Out[124]: True 
Cuestiones relacionadas