#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, по коду всё понятно и очевидно, и красивее, чем с флагами
Комментариев нет:
Отправить комментарий