Страницы

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

пятница, 13 декабря 2019 г.

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

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


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


Ответы

Ответ 1



Вариант первый, некрасивый Для выхода из цикла до его нормального завершения в 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

Ответ 2



Вот goto для выхода из нескольких циклов пришёлся бы кстати, делал так на PHP, по коду всё понятно и очевидно, и красивее, чем с флагами

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

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