У меня есть массив строк. Я хотел бы выселить все элементы, которые начинаются с шаблона. Шаблон содержится в другом массиве.
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, и в конечном итоге это сработает. Однако существует ли более простой подход к удалению элементов из массива, строка которого начинается с (массив)? Спасибо
Просто поменяй на word.startswith(tuple(banned_words))
...
banned_words
— это список строк, а не шаблон. Не говорите «шаблон», потому что это означает «регулярное выражение».
@Tomerikoo: это лучший ответ, опубликуйте его как ответ. Большинство людей не знают, что .startswith(prefix, ...)
может принимать кортеж строк.
@smci ценю предложение, которое в любом случае теперь является частью принятого ответа ...
Отвечает ли это на ваш вопрос? Проверить, начинается ли строка с одной из нескольких подстрок в Python
(@Tomerikoo: да, но это жестокий повторяющийся вопрос, поскольку ошибка ОП связана с индексацией строк по отдельности, этот вопрос слишком многословен, и ответы обязательно касаются ошибок индексации ОП, а не сути вопроса ).
Вы можете использовать понимание списка с фильтром (подробнее здесь)
final = [word for word in words if not any(word.startswith(t) for t in banned_words)]
Вы можете удалить внутренние скобки ([]
) и сделать аргумент any
генератором понимания.
Также вместо этого вы можете использовать функцию filter
(документы здесь). Обратите внимание, что возвращаемый тип filter
не является списком.
Я больше ориентируюсь на понимание, но спасибо.
Как сказал Томерику
>>> 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)
?
startwith проверяет только один шаблон - это неверно ... Из предоставленной вами справки: «префикс также может быть кортежем строк, который нужно попробовать». Так что это может быть и просто: for word in words: if word.startswith(tuple(banned_words))
можете привести пример списка слов