测试多个字符串' in'列表理解中的条件

时间:2017-12-29 11:04:10

标签: python list-comprehension multiple-conditions

我正在尝试添加多个'或'使用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

3 个答案:

答案 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))]

否则andor使用搜索字符串的真值(并且每个非空字符串始终为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"))]