2010-02-22 7 views

Respuesta

20
if any(s in line for s in ('string1', 'string2', ...)): 
1
if 'string1' in line or 'string2' in line or 'string3' in line: 

¿Sería bien para lo que tiene que hacer?

+0

Por supuesto, eso es lo que intenté pero necesitaba un método más legible y eficiente. :) – 3zzy

1

or no se comporta de esa manera. 'string1' or 'string2' or 'string3' in line es equivalente a ('string1') or ('string2') or ('string3' in line), que siempre devolverá true (en realidad, 'string1').

Para obtener el comportamiento que desea, puede decir if any(s in line for s in ('string1', 'string2', 'string3')):.

2

Si se lee la expresión como esta

if ('string1') or ('string2') or ('string3' in line): 

El problema se hace evidente. Lo que sucederá es que 'string1' se evalúa como True, por lo que el resto de la expresión está en cortocircuito.

La forma larga mano para escribir es este

if 'string1' in line or 'string2' in line or 'string3' in line: 

que es un poco repetitivo, por lo que en este caso es mejor utilizar any() como en la respuesta de Ignacio

0

Usando map y lambda

a = ["a", "b", "c"] 
b = ["a", "d", "e"] 
c = ["1", "2", "3"] 

# any element in `a` is a element of `b` ? 
any(map(lambda x:x in b, a)) 
>>> True 

# any element in `a` is a element of `c` ? 
any(map(lambda x:x in c, a)) # any element in `a` is a element of `c` ? 
>>> False 

y función de orden superior

has_any = lambda b: lambda a: any(map(lambda x:x in b, a)) 

# using ... 
f1 = has_any([1,2,3,]) 
f1([3,4,5,]) 
>>> True 
f1([6,7,8,]) 
>>> False 
Cuestiones relacionadas