列表上的Python布尔运算 - 结果不一致

Man*_*nix 2 python boolean list operator-keyword

假设我有两个列表:

>>> y
[False, False, True, False, True, False, False, True, False, True, False, False]
>>> z
[False, True, True, True, True, True, False, False, False, False, False, True]
Run Code Online (Sandbox Code Playgroud)

然后我做以下事情:

>>> y or z
[False, False, True, False, True, False, False, True, False, True, False, False]
>>> z or y
[False, True, True, True, True, True, False, False, False, False, False, True]
Run Code Online (Sandbox Code Playgroud)

不应该正确的答案如下所示?

[False, True, True, True, True, True, False, True, False, True, False, True]
Run Code Online (Sandbox Code Playgroud)

我也得到了错误的答案and:

>>> y and z
[False, True, True, True, True, True, False, False, False, False, False, True]
>>> z and y
[False, False, True, False, True, False, False, True, False, True, False, False]
Run Code Online (Sandbox Code Playgroud)

我用奇数结果测试了1和0:

>>> y=[0,0,0,0,0]
>>> z=[1,1,1,1,1]
>>> y or z
[0, 0, 0, 0, 0]
>>> z or y
[1, 1, 1, 1, 1]
>>> y and z
[1, 1, 1, 1, 1]
>>> z and y
[0, 0, 0, 0, 0]
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

Tom*_*ton 6

y or z在各个元素上,你的行为并不像你想象的那样.相反,它评估第一个参数(y)的"真实性" .由于y是非空列表,因此计算结果为true.然后整体陈述评估为y.

类似地,z or y首先查看z是否真实(它是真的,因为它是非空列表).因此,该语句的评估结果是z没有查看y或其中的元素.

以下是一些更清晰的例子:

>>> [1,2,3,4] or [5,6,7,8]
[1, 2, 3, 4]
>>> ['this','is','a','list'] or ['and','here','is','another']
['this', 'is', 'a', 'list']
Run Code Online (Sandbox Code Playgroud)

空列表的计算结果为'false-y',因此在这种情况下,右侧列表是语句的值:

>>> [] or ['and','here','is','another']
['and', 'here', 'is', 'another']
Run Code Online (Sandbox Code Playgroud)

交换列表的顺序表明,第一个评估为true的结果将是结果:

>>> ['and','here','is','another'] or ['this','is','a','list']
['and', 'here', 'is', 'another']
Run Code Online (Sandbox Code Playgroud)

为了实现你想要的,你可以做一个列表理解

[
    y_item or z_item
    for y_item, z_item
    in zip(y, z)
]
Run Code Online (Sandbox Code Playgroud)