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.