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值测试部分:
任何对象都可以用于真值进行测试,用于在使用
if
或while
病症或如下面的布尔运算的操作数.以下值被视为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)
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)
and
不一定是布尔运算符;它返回它的两个参数之一,而不管它们的类型。如果第一个参数是 false-ish(False
、数字零或空字符串/容器),则返回该参数。否则,它返回第二个参数。
在您的情况下,x
和y
都是非空列表,因此第一个参数始终是 true-ish,意思是x and y
返回y
和y and x
返回x
。