Проверьте, находится ли значение списка в строке, но не в значениях в другом списке

#python

Вопрос:

У меня есть список, который выглядит так:

 list = ['for','and','with','be in']  

И я реализовал некоторый код, который проверяет, содержатся ли вышеуказанные слова в строке:

 if any(word in stringVar for word in list):  \logic  

Вышесказанное работает, как и ожидалось, однако я не хочу, чтобы некоторые фразы были исключены из вышесказанного следующим образом:

 exc_list = ['for every','for each']  

Поэтому, по сути , я хочу изменить свое утверждение if так, чтобы оно возвращало значение true, если and with и be in содержится в stringVar ИЛИ for , содержится в stringVar , но не тогда, когда за ним следует every или each .

Я изначально реализовал это:

 if any(word in stringVar for word in list) and any(word not in stringVar for word in exc_list):  \logic  

Но это не будет работать так, как ожидалось, если значение stringVar равно «будет в каждый день на каждую неделю».

Чтобы подтвердить, я хочу возвращать значение true во все времена , когда and with и be in содержатся в stringVar , даже если for each/every это тоже должно появиться. Исключения должны вступать в силу только тогда, когда for появляются в stringVar

Ответ №1:

Просто используйте замененную строку, удалив все исключения при замене.

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

 string = 'will be in every day for each week' lst = ['for','and','with','be in'] exclusions = ['for every','for each']  replaced_string = string for phrase in exclusions:  replaced_string = replaced_string.replace(phrase, '') if any(word in replaced_string for word in lst):  # do stuff  

Вы даже можете поместить его в функцию, чтобы он выглядел лучше.

 def string_minus_exclusions(string, exclusions):  for phrase in exclusions:  string = string.replace(phrase, '')  return string  string = 'will be in every day for each week' lst = ['for','and','with','be in'] exclusions = ['for every','for each'] replaced = string_minus_exclusions(string, exclusions) if any(word in replaced for word in lst):  # do stuff  

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

1. Ах да, я вижу, как это будет работать, хотя я думаю, что это сломается, когда вы установите replaced_string=», поэтому я изменил его на replaced_string = string.replace(phrase, '')

2. Вы правы. Я не тестировал и просто по умолчанию использовал пустую строку. replaced_string = '' должно быть replaced_string = string