Sé que esta pregunta es demasiado básica, pero no puedo entenderla. Por ejemplo, si tiene que buscar alguna de las N palabras en una cadena, ¿cómo puedo hacer esto? Intenté operaciones lógicas.

('browser' or 'chrome') in 'start game'

Volverá falso.

('browser' or 'chrome') in 'start chrome'

Volverá Verdadero.

('browser' or 'chrome') in 'start chrome'

Esto debería devolver True, pero devuelve false. La palabra chrome está en la cadena, entonces, ¿por qué devuelve falso?

('browser' and 'chrome') in 'start chrome'

Esto devuelve True. Pero por qué devuelve verdadero, incluso si solo una palabra coincide.

Quiero devolver True, incluso si coincide con una sola palabra, sin importar en qué índice se encuentre.

1
Talha Anwar 9 may. 2020 a las 14:19

3 respuestas

La mejor respuesta

('browser' or 'chrome') se evalúa como 'browser'.

Consulte ¿Cómo "y" y "o" actúan con valores no booleanos?

Puede usar la función any:

if any(x in 'start chrome' for x in ('browser', 'chrome')):
    # at least one of the words is in the string 

Y la función all:

if all(x in 'start chrome' for x in ('browser', 'chrome')):
    # both words are in the string
4
khelwood 9 may. 2020 a las 11:31

Probablemente hay dos enfoques con los que podría optar: un enfoque fácil y menos dinámico:

"browser" in "start chrome" or "chrome" in "start chrome"

Un enfoque más largo pero mucho más dinámico:

def OneContains(l, text):
    for i in l:
        if i in text:
            return True
    return False


print(OneContains(["browser","chrome"],"start chrome"))
0
Skalex 9 may. 2020 a las 11:26

Supongamos que queremos calcular a or b. El operador or funciona así:

  1. Si a es verídica, devuelve a
  2. De lo contrario, devuelva b.

Si tiene más de dos operandos, por ejemplo, a or b or c or d, es equivalente a a or (b or (c or d)), por lo que funcionará de acuerdo con este algoritmo:

  1. Si a es verídica, devuelve a
  2. De lo contrario, si b es verdadero, devuelva b
  3. De lo contrario, si c es verdadero, devuelva c
  4. De lo contrario, devuelva d.

Por lo tanto, esta expresión: ('browser' or 'chrome') in 'start chrome' no funcionará como espera. Primero, ('browser' or 'chrome') evaluará a 'browser' (porque 'browser' es verdadero, como lo es cualquier cadena no vacía), y 'browser' in 'start chrome' es False.

Lo que quizás quieras usar es:

('browser' in 'start chrome') or ('chrome' in 'start chrome')

O puede usar any, junto con un generador de comprensión:

string = 'start chrome'
if any(substring in string for substring in ['browser', 'chrome', 'chromium']):
    print('Ta da!')

O, si realmente te gusta map,

if any(map(string.__contains__, ['browser', 'chrome', 'chromium'])):
    print('Ta da!')

Básicamente, any devuelve True si al menos un elemento del iterable dado es truthy.

a and b and c funciona de manera similar a or: 1. Si a es falsey, devuelve a 1. De lo contrario, si b es falsey, devuelve b 1. De lo contrario, devuelva c

Lo que es posible que desee utilizar en lugar de su and - y expresión es:

('start' in 'start chrome') and ('chrome' in 'start chrome')

O puede usar all, que es como any, pero implementa and - lógica en su lugar o or - lógica: https://docs.python.org/3/library/functions.html#all

1
int6h 9 may. 2020 a las 11:30