我有一个关于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
。为什么这两个操作都会发生?
("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
。
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