Почему операции «и / или» в этом операторе Python ведут себя неожиданно? - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть концептуальный вопрос о Python.Это код

list1=['assistant manager', 'salesperson', 'doctor', 'production manager', 'sales manager', 'schoolteacher', 'mathematics teacher']
sub1 = "teacher"
sub2 = "sales"
ans=[]

for item in list1:
    if (sub1 and sub2) in item:
        ans.append(item)

Здесь я ожидаю, что список будет пустым, поскольку ни один из элементов не удовлетворяет условию if sub1 and sub2 in item: Но когда я распечатываю список, я получаю вывод # 1 как это

>>> ans
['salesperson', 'sales manager'] # I expected an empty list here

Кроме того, когда я использую or вместо and, как указано ниже

for item in list1:
    if (sub1 or sub2) in item:
        ans.append(item)

вывод # 2 я получаю

>>> ans
['schoolteacher', 'mathematics teacher'] # I expected a list of words containing sub1 or sub2 as their substrings

Я видел похожее решение здесь , но оно точно не решает мою проблему.Оба раза я получаю результат, которого не ожидаю при использовании and и or.Почему это происходит во время обеих этих операций?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

("teacher" and "sales") in "salesmanager" не означает одно и то же в Python и в английском.

В английском языке это синонимично ("teacher" in "salesmanager") and ("sales" in "salesmanager") (который Python будет понимать, как вы думали, и оценивать в False).

С другой стороны, Python сначала оценит "teacher" and "sales", потому что он в скобках и, следовательно, имеет более высокий приоритет.and вернет первый аргумент, если ошибочно, в противном случае второй аргумент."teacher" не является ложным, поэтому "teacher" and "sales" оценивается как "sales".Затем Python продолжает вычислять "sales" in "salesmanager" и возвращает True.

0 голосов
/ 22 февраля 2019

Операторы and и or делают не то, что вы думаете, они делают.Попробуйте разбить выражения:

if sub1 in item or sub2 in item:

if sub1 in item and sub2 in item:

Оператор and вычисляет свой левый операнд и, если результат верен, возвращает правый операнд, в противном случае левый операнд.

Оператор or вычисляет свой левый операнд и, если результат ложный, возвращает правый операнд, в противном случае левый операнд.

Итак, в вашем первом выражении вычисляетсяследующим образом:

(sub1 and sub2) in item
("teacher" and "sales") in item
("sales") in item

, что не соответствует ожиданиям.

Аналогично для вашего второго выражения:

(sub1 or sub2) in item
("teacher" or "sales") in item
("teacher") in item
...