Python: как отфильтровать элементы из массива строк, начинающихся с определенного шаблона

У меня есть массив строк. Я хотел бы выселить все элементы, которые начинаются с шаблона. Шаблон содержится в другом массиве.

words=[] # contains the word lists

banned_words = ["http:","https:","mailto:"]

for word in words:

    if (word.startswith(banned_words)):
        continue

    addWord(word)

Я не включаю функцию addWord для простоты, однако моя попытка состояла в том, чтобы использовать startWith против массива запрещенных слов. Но это не работает. Я мог бы зациклиться на каждом элементе Banned_words, и в конечном итоге это сработает. Однако существует ли более простой подход к удалению элементов из массива, строка которого начинается с (массив)? Спасибо

можете привести пример списка слов

sahasrara62 15.12.2020 12:19

Просто поменяй на word.startswith(tuple(banned_words))...

Tomerikoo 15.12.2020 12:50
banned_words — это список строк, а не шаблон. Не говорите «шаблон», потому что это означает «регулярное выражение».
smci 15.12.2020 12:52

@Tomerikoo: это лучший ответ, опубликуйте его как ответ. Большинство людей не знают, что .startswith(prefix, ...) может принимать кортеж строк.

smci 15.12.2020 12:56

@smci ценю предложение, которое в любом случае теперь является частью принятого ответа ...

Tomerikoo 15.12.2020 12:57

Отвечает ли это на ваш вопрос? Проверить, начинается ли строка с одной из нескольких подстрок в Python

Tomerikoo 15.12.2020 12:58

(@Tomerikoo: да, но это жестокий повторяющийся вопрос, поскольку ошибка ОП связана с индексацией строк по отдельности, этот вопрос слишком многословен, и ответы обязательно касаются ошибок индексации ОП, а не сути вопроса ).

smci 15.12.2020 13:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
230
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать понимание списка с фильтром (подробнее здесь)

final = [word for word in words if not any(word.startswith(t) for t in banned_words)]

Вы можете удалить внутренние скобки ([]) и сделать аргумент any генератором понимания.

Roy Cohen 15.12.2020 12:44

Также вместо этого вы можете использовать функцию filter (документы здесь). Обратите внимание, что возвращаемый тип filter не является списком.

Roy Cohen 15.12.2020 12:52

Я больше ориентируюсь на понимание, но спасибо.

MetallimaX 15.12.2020 12:58
Ответ принят как подходящий

Как сказал Томерику

>>> help(str.startswith)
startswith(...)
    S.startswith(prefix[, start[, end]]) -> bool

    Return True if S starts with the specified prefix, False otherwise.
    With optional start, test S beginning at that position.
    With optional end, stop comparing S at that position.
    prefix can also be a tuple of strings to try.

«префикс также может быть кортежем строк, который нужно попробовать». Так что это может быть и просто:

for word in words: 
    if word.startswith(tuple(banned_words))

Вы имели в виду word.startswith(pat)?

Roy Cohen 15.12.2020 12:41

startwith проверяет только один шаблон - это неверно ... Из предоставленной вами справки: «префикс также может быть кортежем строк, который нужно попробовать». Так что это может быть и просто: for word in words: if word.startswith(tuple(banned_words))

Tomerikoo 15.12.2020 12:49

Другие вопросы по теме