Страницы

Поиск по вопросам

пятница, 19 октября 2018 г.

Выход из нескольких циклов

Есть входной список, элементы которого состоят из некого текста. Нужно проверить, есть ли в элементах списка слова из одного списка и из другого, и если есть слова из одного, и нет из другого, то вывести некое сообщение. Не получается завершить несколько циклов после получения результата и перейти к следующему элементу списка
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

Комментариев нет:

Отправить комментарий