列表元素之间的按位运算

16 投票
4 回答
15361 浏览
提问于 2025-04-21 04:48

我有一个包含按位元素的列表,比如说 [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

撰写回答