Вложенные операторы "и / или" если

Я работаю над кодом, который создает список и затем применяет условия "или" и "и" для выполнения дальнейших действий:

a= ["john", "carlos", "22", "70"]

if (("qjohn" or "carlos") in a) and (("272" or "70") in a):
    print "true"
else:
    print "not true"

выход:

not true

когда я делаю это:

a= ["john", "carlos", "22", "70"]

if ("qjohn" or "cdarlos" in a) and ("272" or "d70" in a):
    print "true"
else:
    print "not true"

вывод "true"

Что я не получаю, так это **carlos and 70** должно быть равно true, но это печать "не правда". В чем причина этой ошибки? Спасибо

3 ответа

Решение

Оба подхода неверны. Имейте в виду или оператор короткого замыкания, поэтому он не делает то, что вы думаете, что он делает:

он оценивает только второй аргумент, если первый является ложным.

Однако непустые строки всегда True, так что первый случай проверяет только наличие первой непустой строки, в то время как второй никогда не выполняет проверку содержимого с помощью in следовательно, всегда True,

То, что вы хотите, это:

if ("qjohn" in a or "carlos" in a) and ("272"  in a or "70" in a):
   ...

Если бы элементы для тестирования были длиннее, вы могли бы избежать повторения or используя any который нравится or также короткое замыкание один раз из теста True:

if any(x in a for x in case1) and any(x in a for x in case2):
   ...
b = set(a)
if {"qjohn", "carlos"} & b and {"272", "70"} & b:
    ....

Условный True если пересечение множеств приводит к непустому множеству (проверка принадлежности), проверка истинности непустого множества в этом отношении довольно питонна.


В качестве альтернативы, используя set.intersection:

if {"qjohn", "carlos"}.insersection(a) and {"272", "70"}.insersection(a):
    ....

Оба неверны. Вы поняли логику неверной.

("qjohn" or "carlos") in a эквивалентно "qjohn" in a

а также

"qjohn" or "cdarlos" in a эквивалентно "qjohn" or ("cdarlos" in a)

Другие вопросы по тегам