我正在尝试添加多个'或'使用list comprehension对python if语句进行子句。我的代码如下所示。我想保持列表理解。就伪代码而言,逻辑就是:
Alive_Beatles =包含'(Beatle)'的每个名字。 和(' Paul',' Yoko'或' Ringo')
该代码仅返回Paul并跳过Ringo和Yoko。
Names = ["John Lennon (Beatle)", "Paul McCartney (Beatle)", "Ringo Starr (Beatle)", "Yoko Ono (Beatle)", "Mick Jagger (Rolling Stone)", "Brian Jones (Rolling Stone)", "Alex Jones (na)", "Adam Smith (na)"]
Alive_Beatles = [n for n in Names if ("Beatle" and ("Paul" or "Ringo" or "Yoko")) in n]
print Alive_Beatles
答案 0 :(得分:3)
如果名称为in n
:
[n for n in Names if ("Beatle" in n and ("Paul" in n or "Ringo" in n or "Yoko" in n))]
否则and
和or
使用搜索字符串的真值(并且每个非空字符串始终为True),最后测试Paul in n
(第一个真值是or
s。。
documentation明确提及:
4.2。布尔运算 - 和,或,不是
这些是布尔运算,按升序优先顺序排列:
Operation Result Notes x or y if x is false, then y, else x (1) x and y if x is false, then x, else y (2) not x if x is false, then True, else False (3)
注意:
(1)这是一个短路运算符,所以如果第一个参数为假,它只会计算第二个参数。
(2)这是一个短路运算符,所以如果第一个参数为真,它只会计算第二个参数。
(3)没有比非布尔运算符更低的优先级,因此不是a == b被解释为not(a == b),而a == not b是语法错误。
因此"Beatle" and (...)
根据(2)对第二个参数进行求值,因为"Beatle"
是真实的,并且根据(1)它计算链式or
的第一个参数:{ {1}}因为它也是真的。
答案 1 :(得分:0)
这不符合您的期望,因为表达式
Task t2 = new Task(()=>
{
//Do task1 codes
}
);
Task t3 = new Task(()=>
{
//Do task1 codes
}
);
t1.start();
t2.start();
t3.start();
评估为("Paul" or "Ringo" or "Yoko")
。在解释器提示符下键入它以确认这一点。
即使只是因为
"Paul"
也评估为("Beatle" and ("Paul" or "Ringo" or "Yoko"))
。
答案 2 :(得分:0)
最直接的解决方案就是列出
[n for n in Names if "Beatle" in n and ("Paul" in n or "Ringo" in n or "Yoko" in n)]
但您可以使用any
来更接近您最初尝试的内容:
[n for n in Names if "Beatle" in n and any(x in n for x in ("Paul", "Ringo", "Yoko"))]