str.starts with avec une liste de chaînes à tester

189

J'essaie d'éviter d'utiliser autant d'instructions if et de comparaisons et d'utiliser simplement une liste, mais je ne sais pas comment l'utiliser avec 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"

Ce que j'aimerais qu'il soit, c'est:

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

Toute aide serait appréciée.

Éternité
la source
8
Les réponses à cette question me rappellent pourquoi j'aime tant Python!
dotancohen
Même si vous devez faire plusieurs vérifications pour une raison quelconque, vous devez enregistrer le résultat de ˋlower () ˋ. Inutile de faire ça encore et encore.
Bachsau

Réponses:

369

str.startswith vous permet de fournir un tuple de chaînes à tester:

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

À partir de la documentation :

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

Retourne Truesi la chaîne commence par le prefix, sinon retourne False. prefixpeut également être un tuple de préfixes à rechercher.

Voici une démonstration:

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

la source
3
Et s'il ne prend pas en charge cela, vous pouvez le faire de toute façon avec anyet un genexp.
user2357112 prend en charge Monica
Conditionnel contrefactuel, et non "peut-être que l'OP est sur une ancienne version".
user2357112 prend en charge Monica
hé, si j'utilise ceci dans le cadre d'une fonction, comment pourrais-je le faire renvoyer l'élément de la liste auquel il correspond?
roastbeeef
Boucle @roastbeeef ˋforˋ. Aucune autre option. ;)
Bachsau
29

Vous pouvez également utiliser any(), map()comme ceci:

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

Ou bien, en utilisant une expression de générateur :

if any(l.startswith(s) for s in x)
    pass # Do something
Dafinguzman
la source
6
N'utilisez pas de compréhension de liste avec aucun; utiliser un générateur.
DylanYoung