Сравните, если два выражения bool имеют одинаковое значение (либо True, либо оба False), чтобы выражение if было истинным - PullRequest
0 голосов
/ 09 декабря 2018

У меня проблемы с пониманием поведения моего кода.

Я пытаюсь сравнить два логических выражения, которые должны быть одинаковыми или иметь только одно конкретное требование, может быть правдой.Эта часть кода взята из функции, которая заполняет тюрьму:

test_1 = (gender in prison.keys())
test_2 = bool(convict_entering[gender]) 

=> convict_entering - это дикт, который имеет в качестве ключей пол и в качестве значений список, а пустой список рассматривается как Falseон должен работать

if not (test_1 != test_2):
    #does something if both are either true or either false
else:
    #does something if the 2 bool are different

, но когда 2 значения равны True, мой код входит в оператор else, поэтому я не знаю, чего мне здесь не хватает.

Вот мой фактический код, как показано на рисунке ниже

test_1 = (gender in prison.keys())
test_2 = bool(convict_entering[gender]) 
if not (gender in prison.keys() != bool(convict_entering[gender])): 

here's a picture with VS code where you can see the moment

Ответы [ 3 ]

0 голосов
/ 09 декабря 2018

Ваша проблема возникает из-за цепочки операторов.

Когда у вас есть:

if not (gender in prison.keys() != bool(convict_entering[gender])):

... оператор != сравнивает логическое выражение правой руки с просто genderне с результатом оператора in.Вы должны заставить оператор in быть изолированным, чтобы он не был связан с !=.Это можно сделать с помощью круглых скобок:

if not ((gender in prison.keys()) != bool(convict_entering[gender])):

Обратите внимание, что эта проблема не возникает, когда в условии if вы используете переменные, которые представляют отдельные вычисляемые выражения (test_1 и test_2).).Вы сделали это в коде, который вы указали в вопросе, но не в своем фактическом коде.

Подобные вещи случаются с другими операторами, которые можно объединить в цепочку, как описано здесь:

В качестве примечания можно также использовать == и опустить not:

if (gender in prison.keys()) != bool(convict_entering[gender]):
0 голосов
/ 09 декабря 2018

(Опубликован ответ от имени автора вопроса) .

Спасибо за ваши быстрые ответы.Я все еще новичок в кодировании.

Видимо, мой код был верным, но я забыл изолировать левую часть своего «оператора if», так что это просто ошибка ввода, которую я вообще не видел.

0 голосов
/ 09 декабря 2018

Ваш код работает правильно, когда оба значения верны.Вот пример того, как оба значения являются истинными:

prison = {"male":1,"female":2}
convict_entering = {"male":3,"female":4}
gender = "male"
test_1 = (gender in prison.keys())
test_2 = bool(convict_entering[gender]) 
if not (test_1 != test_2):
    print("if")
else:
    print("else")

Хотя вы можете упростить двойное отрицание до if (test_1 == test_2):

...