str.startswith z listą ciągów do przetestowania

183

Staram się unikać używania tak wielu instrukcji if i porównań i po prostu używam listy, ale nie wiem, jak jej używać z 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"

Chciałbym, żeby to było:

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

Każda pomoc będzie mile widziana.

Wieczność
źródło
7
Odpowiedzi na to pytanie przypominają mi, dlaczego tak bardzo kocham Pythona!
dotancohen
Nawet jeśli z jakiegoś powodu musisz wykonać kilka sprawdzeń, powinieneś zapisać wynik ˋlower () ˋ. Nie ma sensu robić tego raz po raz.
Bachsau

Odpowiedzi:

346

str.startswith pozwala na dostarczenie krotki ciągów do przetestowania pod kątem:

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

Z dokumentów :

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

Zwróć, Truejeśli ciąg zaczyna się od prefix, w przeciwnym razie zwróć False. prefixmoże być również krotką przedrostków, których należy szukać.

Poniżej znajduje się demonstracja:

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

źródło
3
A jeśli to nie obsługuje, możesz to zrobić i tak z anygenexpem.
user2357112 obsługuje Monikę
Warunek alternatywny, a nie „może PO jest w starej wersji”.
user2357112 obsługuje Monikę
hej, jeśli używam tego jako części funkcji, jak mogę sprawić, aby zwrócił element z listy, który jest dopasowany?
roastbeeef
@roastbeeef ˋforˋ loop. Żadnych innych opcji. ;)
Bachsau
26

Możesz także użyć any(), na map()przykład:

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

Lub alternatywnie, używając wyrażenia generatora :

if any(l.startswith(s) for s in x)
    pass # Do something
dafinguzman
źródło
6
Nie używaj listy ze zrozumieniem z żadnym; użyj generatora.
DylanYoung,