python编码中,我们有时希望对两个长度相同的列表进行像“按位与”的操作,但结果并不如我们的预期。
如:
a=[0,0,1,1,1,0]
b=[1,0,1,0,1,0] # 预期是得到[0,0,1,0,1,0]
e=a and b # e列表为 [1,0,1,0,1,0]
进行and
运算时,我们从最简单的两数相与开始讨论
- 两数相与:
当x and y
的结果为True
的时候,返回的并不是True
,而是运算结果的最后一位变量的值。这里是返回y
的值。 - 列表相与:
列表list1
和list2
中遍历元素i
和j
。当i and j
结果为False
的时候,返回的是第一个False
的值,如i
和j
都为False
那么返回i
的值,i
为真,j
为假,那么返回的是j
的值。
这样看来,一开始的例子运算的结果就可以解释了。
但这样并不能得到我们预期的效果。
可以编码如下:
c=[a[i] & b[i] for i in range(len(a))]
d=[a[i] and b[i] for i in range(len(a))]
c
和d
的运算方式都可以得到正确的结果。
这样的方式在其他数据结构中并不一定成立。如在numpy
中的数组np.array
支持矩阵之间的and
运算,然后返回对应布尔矩阵。pandas
中的Series
和DataFrame
中也支持相应的布尔索引