Вложенные операторы "и / или" если
Я работаю над кодом, который создает список и затем применяет условия "или" и "и" для выполнения дальнейших действий:
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)