2011-03-07 11 views
30

bastante seguro de que es un idioma común, pero no pudo encontrar con google ..
Esto es lo que quiero hacer (en Java):Comprobar si un predicado evalúa cierto para todos los elementos de un iterable en pitón

// Applies the predicate to all elements of the iterable, and returns 
// true if all evaluated to true, otherwise false 
boolean allTrue = Iterables.all(someIterable, somePredicate); 

¿Cómo se hace esto "pythonic" en python?

También sería grande si puedo conseguir respuesta para esto, así:

// Returns true if any of the elements return true for the predicate 
boolean anyTrue = Iterables.any(someIterable, somePredicate); 

Respuesta

58

¿Quieres decir algo como:

allTrue = all(somePredicate(elem) for elem in someIterable) 
anyTrue = any(somePredicate(elem) for elem in someIterable) 
+6

Estas formas también tienen la ventaja de "cortocircuitos": 'all' terminará en la primera' ocurrencia false', y 'any' terminará en la primera' ocurrencia true'. –

+2

¿Soy el único que piensa que esto es inaceptablemente detallado para una operación tan común? – cic

+0

Bienvenido a Python @cic. : D Hay coco que es más susceptible a FP http://coconut-lang.org/ –

6
allTrue = all(map(predicate, iterable)) 
anyTrue = any(map(predicate, iterable)) 
+2

Esto iterará sobre la secuencia dos veces ... –

+1

Para usar el cortocircuito aquí, puede reemplazar 'map' con' itertools. imap'. –

+2

@ Space_C0wb0y - en Python 3, el mapa devuelve un iterador, no una lista, por lo que ya no sería necesario imap. – PaulMcG

0

Puede utilizar 'todos' y 'cualquier 'funciones integradas en python

all(map(somePredicate, somIterable)) 

aquí somePredicate es una función y 'toda' comprobará si bool() de dicho elemento sea verdadera

1

Este es un ejemplo que comprueba si una lista contiene todos los ceros:

x = [0, 0, 0] 
all(map(lambda v: v==0, x)) 
# Evaluates to True 

x = [0, 1, 0] 
all(map(lambda v: v==0, x)) 
# Evaluates to False 

alternativa también se puede hacer :

all(v == 0 for v in x) 
Cuestiones relacionadas