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.


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

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

6
N'utilisez pas de compréhension de liste avec aucun; utiliser un générateur.
— DylanYoung
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.