我有一个关于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:
,但是当我打印列表时,我得到的是 output#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
我看到了外观类似的解决方案here,但它不能完全解决我的问题。两次都得到了使用and
和or
时无法预期的结果。为什么在这两个操作中都会发生这种情况?
答案 0 :(得分:16)
("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
。
答案 1 :(得分:6)
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