Avatar ·

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

📁 список, python

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

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')

Также прошу простить за возможные ошибки или опечатки в коде.

Avatar ·

Вариант первый, некрасивый

Для выхода из цикла до его нормального завершения в Python используется оператор break:

for item in items:    if some_condition:        break

Для того, чтобы выйти из нескольких циклов по условию, выполнившемуся во внутреннем цикле, используется флаг выхода - переменная, которая изначально имеет значение False, а при необходимости выйти из цикла преждевременно принимает значение True:

flag = Falsefor 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:            retu True    retu 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.

Переписав код таким образом вы сохраните изначально задуманную функциональность, при этом значительно повысив читаемость кода и упростив возможные изменения в будущем.

Войдите чтобы оставить ответ

Блоги