列表元素之间的按位运算
我有一个包含按位元素的列表,比如说 [1,1,1],我想对列表中的每个元素进行按位或运算。举个例子:
对于 [1,1,1] 来说:
1 | 1 | 1 = 1
再比如对于 [1,17,1]:
1 | 17 | 1 = 17
我想知道怎么在不使用循环的情况下做到这一点?Numpy 的 bitwise_or 似乎只适用于两个数组。有没有一种按位与或按位或的方式可以对每个元素进行操作,类似于求和或 np.mean?谢谢。
4 个回答
0
在Python 3中,reduce
不再是一个内置函数了。现在可以使用functools.reduce
,并且可以和operator.or_
一起使用。
from functools import reduce
import operator
l = [1, 17, 1]
result = reduce(operator.or_, l)
print(result) # 17
另外,下面的解决方案可以专门用于整数:
from functools import reduce
l = [1, 17, 1]
result = reduce(int.__or__, l)
3
不需要导入任何东西,包括 numpy
或者 operator.ior
,就像其他回答中提到的那样:
a = [1,17,1]
reduce(lambda x,y: x | y, a)
补充:不过,当我对不同的选项进行性能测试时,这个方法更快:
a = [1,17,1]; b = 0
for x in a: b |= x
这个第二个选项还有一个好处,就是它在 Python 3 中也能用,因为在 Python 3 中 reduce
被去掉了(不过还是可以从 functools
导入)。
30
你可以使用 reduce
结合 operator.ior
来实现:
>>> from operator import ior
>>> lst = [1, 17, 1]
>>> reduce(ior, lst)
17
而且正如 @DSM 在评论中提到的,numpy 的对应写法是:
>>> import numpy as np
>>> arr = np.array(lst)
>>> np.bitwise_or.reduce(arr)
17
13
这段代码适用于 numpy的reduce功能:
>>> ar = numpy.array([1,17,1])
>>> numpy.bitwise_or.reduce(ar)
17