str. comienza con una lista de cadenas para probar

183

Estoy tratando de evitar el uso de tantas declaraciones if y comparaciones y simplemente uso una lista, pero no estoy seguro de cómo usarla con str.startswith:

if link.lower().startswith("js/") or link.lower().startswith("catalog/") or link.lower().startswith("script/") or link.lower().startswith("scripts/") or link.lower().startswith("katalog/"):
    # then "do something"

Lo que me gustaría que fuera es:

if link.lower().startswith() in ["js","catalog","script","scripts","katalog"]:
    # then "do something"

Cualquier ayuda sería apreciada.

Eternidad
fuente
77
¡Las respuestas a esta pregunta me recuerdan por qué amo tanto a Python!
dotancohen
Incluso si necesita hacer varias comprobaciones por algún motivo, debe guardar el resultado de ˋlower () ˋ. No tiene sentido hacerlo una y otra vez.
Bachsau

Respuestas:

346

str.startswith le permite proporcionar una tupla de cadenas para probar:

if link.lower().startswith(("js", "catalog", "script", "katalog")):

De los documentos :

str.startswith(prefix[, start[, end]])

Regrese Truesi la cadena comienza con el prefix, de lo contrario regrese False. prefixTambién puede ser una tupla de prefijos para buscar.

A continuación se muestra una demostración:

>>> "abcde".startswith(("xyz", "abc"))
True
>>> prefixes = ["xyz", "abc"]
>>> "abcde".startswith(tuple(prefixes)) # You must use a tuple though
True
>>>

fuente
3
Y si no es compatible con esto, podría hacerlo de todos modos con anyy un genexp.
user2357112 es compatible con Monica el
Condicional contrafactual, no "tal vez el OP está en una versión anterior".
user2357112 es compatible con Monica el
oye, si estoy usando esto como parte de una función, ¿cómo podría hacer que devuelva el elemento de la lista que coincide?
roastbeeef
@roastbeeef ˋforˋ loop. No hay otras opciones. ;)
Bachsau
26

También puedes usar any(), map()así:

if any(map(l.startswith, x)):
    pass # Do something

O, alternativamente, usando una expresión generadora :

if any(l.startswith(s) for s in x)
    pass # Do something
Dafinguzman
fuente
66
No use una lista de comprensión con ninguna; usa un generador.
DylanYoung