Verificaciones de valores múltiples utilizando el operador ‘in’ (Python)

if 'string1' in line: ... 

… funciona como se esperaba pero, ¿qué pasa si necesito revisar varias cadenas como esta?

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

… no parece funcionar.

 if any(s in line for s in ('string1', 'string2', ...)): 

Si lees la expresión como esta

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

El problema se vuelve obvio. Lo que sucederá es que ‘string1’ se evalúa como Verdadero, por lo que el rest de la expresión tiene un corto circuito.

La forma más larga de escribirlo es esta.

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

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

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

¿Estaría bien para lo que necesitas hacer?

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á verdadero (en realidad, 'string1' ).

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


  1. Tiene esta confusión porque no entiende cómo funciona el operador lógico con respecto a la cadena.

    Python considera que las cadenas vacías son falsas y las cadenas no vacías como verdaderas.

    El correcto funcionamiento es:

    ayb devuelve b si a es verdadero, de lo contrario devuelve a.

    a o b devuelve a si a es verdadero, de lo contrario devuelve b.

    Por lo tanto, cada vez que coloque una cadena no vacía en lugar de string1, la condición devolverá True y continuará, lo que dará como resultado un comportamiento no deseado. Espero eso ayude :).

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 alto orden

 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