Если вы откроете интерпретатор Python, вы обнаружите, что "doc" and "pdf" and "xls" and "jpg"
- это то же самое, что и 'jpg'
:
>>> "doc" and "pdf" and "xls" and "jpg"
'jpg'
Таким образом, вместо того, чтобы проверять все строки, ваша первая попытка проверяет только 'jpg'.
Есть несколько способов сделать то, что вы хотите. Ниже приведено не самое очевидное, но это полезно:
if not any(test_string in text for test_string in ["doc", "pdf", "xls", "jpg"]):
filtered.append(text)
Другой подход заключается в использовании цикла for
в сочетании с оператором else
:
for test_string in ["doc", "pdf", "xls", "jpg"]:
if test_string in text:
break
else:
filtered.append(text)
Наконец, вы можете использовать чистое понимание списка:
tofilter = ["one.pdf", "two.txt", "three.jpg", "four.png"]
test_strings = ["doc", "pdf", "xls", "jpg"]
filtered = [s for s in tofilter if not any(t in s for t in test_strings)]
EDIT
Если вы хотите отфильтровать как слова, так и расширения, я бы порекомендовал следующее:
text_list = generate_text_list() # or whatever you do to get a text sequence
extensions = ['.doc', '.pdf', '.xls', '.jpg']
words = ['some', 'words', 'to', 'filter']
text_list = [text for text in text_list if not text.endswith(tuple(extensions))]
text_list = [text for text in text_list if not any(word in text for word in words)]
Это все еще может привести к некоторым несоответствиям; вышеприведенное также фильтрует «Сделай что-нибудь», «Он - мастер слов» и т. д. Если это проблема, то вам может потребоваться более сложное решение.