两个布尔列表上的Python AND运算符 - 如何?

Gle*_*n N 34 python boolean list operator-keyword

我有两个布尔列表,例如,

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

我想和这些列表一起使用预期的输出:

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

我认为这个表达x and y方式可行,但后来发现它没有:事实上,(x and y) != (y and x)

产量x and y:[True,False,True,False]

产量y and x:[True,True,False,False]

使用列表推导确实有正确的输出.呼!

xy = [x[i] and y[i] for i in range(len(x)]
Run Code Online (Sandbox Code Playgroud)

请注意,我找不到任何引用,告诉我AND运算符会在我尝试使用x和y时工作.但是在Python中尝试很容易.有人可以向我解释发生了x and y什么吗?

这是一个简单的测试程序:

import random
random.seed()
n = 10
x = [random.random() > 0.5 for i in range(n)]
y = [random.random() > 0.5 for i in range(n)]
# Next two methods look sensible, but do not work
a = x and y
z = y and x
# Next: apparently only the list comprehension method is correct
xy = [x[i] and y[i] for i in range(n)]
print 'x        : %s'%str(x)
print 'y        : %s'%str(y)
print 'x and y  : %s'%str(a)
print 'y and x  : %s'%str(z)
print '[x and y]: %s'%str(xy)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 40

and简单地根据它们的真值返回第一个或第二个操作数.如果第一个操作数被视为false,则返回它,否则返回另一个操作数.

列表在非空时被认为是真的,因此两个列表都被认为是真的.他们的内容在这里没有发挥作用.

因为两个列表都不为空,所以x and y只返回第二个列表对象; 只有当x它为空时才会返回:

>>> [True, False] and ['foo', 'bar']
['foo', 'bar']
>>> [] and ['foo', 'bar']
[]
Run Code Online (Sandbox Code Playgroud)

请参阅Python文档中的Truth值测试部分:

任何对象都可以用于真值进行测试,用于在使用ifwhile病症或如下面的布尔运算的操作数.以下值被视为false:

[...]

  • 任何空序列,例如'',(),[].

[...]

所有其他值都被认为是真的 - 因此许多类型的对象始终是真的.

(强调我的),以及下面的布尔运算部分:

x and y
如果x为假,则为x,否则为y

这是一个短路运算符,所以它只计算第二个参数,如果第一个参数是True.

您确实需要显式地测试列表中包含的值.正如您所发现的那样,您可以使用列表解析来完成此操作.您可以使用zip()函数重写它以配对值:

[a and b for a, b in zip(x, y)]
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的出色解释,特别是。重复我所看到的“如果x为假,则x,否则y”,但没有完全理解。这是 RTFM 的一个案例,我应该仔细阅读它! (3认同)

daw*_*awg 10

你可以使用numpy:

>>> import numpy as np
>>> x=np.array([True,True,False,False])
>>> y=np.array([True,False,True,False])
>>> x & y
array([ True, False, False, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

Numpy允许对数组进行数值和逻辑运算,例如:

>>> z=np.array([1,2,3,4])
>>> z+1
array([2, 3, 4, 5])
Run Code Online (Sandbox Code Playgroud)

您可以按位执行并与&操作员一起执行.

您可以使用numpy直接生成布尔数组,而不是列表解析,如下所示:

>>> np.random.random(10)>.5
array([ True,  True,  True, False, False,  True,  True, False, False, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)


Alw*_*ing 9

这是一个简单的解决方案:

np.logical_and(x,y)
Run Code Online (Sandbox Code Playgroud)


che*_*ner 6

and不一定是布尔运算符;它返回它的两个参数之一,而不管它们的类型。如果第一个参数是 false-ish(False、数字零或空字符串/容器),则返回该参数。否则,它返回第二个参数。

在您的情况下,xy都是非空列表,因此第一个参数始终是 true-ish,意思是x and y返回yy and x返回x