我有两个布尔列表,例如,
x=[True,True,False,False] y=[True,False,True,False]
我想将这些列表与预期的输出一起:
xy=[True,False,False,False]
我以为表达x and y会起作用,但后来发现它不起作用:事实上,(x and y) != (y and x)
x and y
(x and y) != (y and x)
输出x and y:[True,False,True,False]
[True,False,True,False]
输出y and x:[True,True,False,False]
y and x
[True,True,False,False]
使用列表推导 确实 具有正确的输出。ew!
xy = [x[i] and y[i] for i in range(len(x)]
请注意,我找不到任何可以告诉我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)
and只需根据它们的真实值返回第一个或第二个操作数。如果第一个操作数被认为是假,则返回它,否则返回另一个操作数。
and
名单被认为是 真实的 ,当 不为空 ,那么这两个列表被认为是真实的。它们的内容 在这里不起作用 。
由于两个列表都不为空,因此x and y只需返回第二个列表对象;仅当x为空时,才返回:
x
>>> [True, False] and ['foo', 'bar'] ['foo', 'bar'] >>> [] and ['foo', 'bar'] []
请参阅Python文档中的“ 真值测试” 部分:
可以测试任何对象的真值,用在if或while条件中或用作以下布尔运算的操作数。以下值为“假”: […] 任何空序列,例如'',(),[]。 […] 所有其他值都被认为是真实的 -因此许多类型的对象总是真实的。
可以测试任何对象的真值,用在if或while条件中或用作以下布尔运算的操作数。以下值为“假”:
if
while
[…]
''
()
[]
所有其他值都被认为是真实的 -因此许多类型的对象总是真实的。
(重点是我的),以及其下方的 布尔运算 部分:
x and y 如果 x 为假,则为 x ,否则为 y 这是一个短路运算符,因此,如果第一个参数为,则它仅计算第二个参数True。
x and y 如果 x 为假,则为 x ,否则为 y
这是一个短路运算符,因此,如果第一个参数为,则它仅计算第二个参数True。
True
您确实需要显式测试列表中 包含 的值。如您所见,您可以通过列表理解来做到这一点。您可以使用zip()函数将其重写以配对值:
zip()
[a and b for a, b in zip(x, y)]