str.startswith зі списком рядків для перевірки


183

Я намагаюся уникати такої кількості, якщо твердження та порівняння, і просто використовувати список, але не впевнений, як ним користуватися 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"

Я б хотів, щоб це було:

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

Будь-яка допомога буде вдячна.


7
Відповіді на це запитання нагадують мені, чому я так люблю Python!
dotancohen

Навіть якщо вам потрібно зробити кілька перевірок з якоїсь причини, вам слід зберегти результат ˋlower () ˋ. Немає сенсу робити це знову і знову.
Бахсау

Відповіді:


346

str.startswith дозволяє поставити кортеж струн для тестування на:

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

З документів :

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

Повернути, Trueякщо рядок починається з prefix, інакше повернути False. prefixтакож може бути рядом префіксів, які потрібно шукати.

Нижче демонстрація:

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

3
І якби це не підтримувало, ви все одно можете це зробити anyі з genexp.
user2357112 підтримує Моніку

Контрфактичний умовний, а не "можливо, ОП на старій версії".
user2357112 підтримує Моніку

Ей, якщо я використовую це як частину функції, як я можу змусити його повернути елемент зі списку, який він відповідає?
roastbeeef

@roastbeeef ˋforˋ петля. Інших варіантів немає. ;)
Бахсау

26

Ви також можете використовувати any(), map()наприклад , так:

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

Або в якості альтернативи, використовуючи генераторний вираз :

if any(l.startswith(s) for s in x)
    pass # Do something

6
Не використовуйте розуміння списку ні з ким; використовувати генератор.
DylanYoung
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.