Есть входной список, элементы которого состоят из некого текста. Нужно проверить, есть ли в элементах списка слова из одного списка и из другого, и если есть слова из одного, и нет из другого, то вывести некое сообщение.
Не получается завершить несколько циклов после получения результата и перейти к следующему элементу списка
some_text = ['some text','another text','one more']
whitelist = ['another','more']
blacklist = ['some','else']
for text in some_text:
for items in blacklist:
if text.find(items) != -1:
for item in whitelist:
if text.find(item) == -1:
print('Found!')
else:
print('Not found')
Также прошу простить за возможные ошибки или опечатки в коде.
Ответ
Вариант первый, некрасивый
Для выхода из цикла до его нормального завершения в Python используется оператор break
for item in items:
if some_condition:
break
Для того, чтобы выйти из нескольких циклов по условию, выполнившемуся во внутреннем цикле, используется флаг выхода - переменная, которая изначально имеет значение False, а при необходимости выйти из цикла преждевременно принимает значение True
flag = False
for outer in outer_list:
for inner in inner_list:
if some_condition:
flag = True
break
if flag:
break
Таким образом можно выйти из любого количества вложенных циклов, нужно лишь добавлять проверку на флаг выхода в конец каждого.
Вариант второй, красивый
Вам стоит немного поменять структуру вашего кода. Для начала вынесите проверки на вхожденения слов из blacklist и whitelist в отдельную функцию:
def contains_words(text, words_list):
for word in words_list:
if text.find(word) != -1:
return True
return False
Теперь проверка на вхождение слов из whitelist и невхождение слов из blacklist будет выглядеть так:
for text in some_text:
if contains_words(text, whitelist) and not contains_words(text, blacklist):
print("Found")
else:
print("Not found")
Если выражение contains_words(text, whitelist) вернёт False, Python не станет вычислять значение выражения not contains_words(text, blacklist), так как, каким бы оно ни было, значение выражения contains_words(text, whitelist) and not contains_words(text_blacklist) всегда будет False
Переписав код таким образом вы сохраните изначально задуманную функциональность, при этом значительно повысив читаемость кода и упростив возможные изменения в будущем.
http://ideone.com/bOO2RM
Комментариев нет:
Отправить комментарий