[英]xor of elements of a list/tuple
我有一个'0'
和'1'
元组,我想要它所有元素的异或。 例如,如果我有('0', '1', '1', '0')
,我想获得((0 xor 1) xor 1) xor 0
。
我有以下(工作)片段:
bit = ('0', '1', '0', '1', '0', '1', '0')
out = bit[0]
for i in range(1, len(bit)):
out = int(out) ^ int(bit[i])
print str(out)
我怎样才能以更 Pythonic 的方式制作它(使用map
和 lambda 函数?)
print reduce(lambda i, j: int(i) ^ int(j), bit)
reduce(...) reduce(function, sequence[, initial]) -> value
将两个参数的函数从左到右累积应用于序列的项,从而将序列减少到单个值。 例如,reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) 计算 ((((1+2)+3)+4)+5)。 如果initial 存在,它在计算中放在序列的项之前,并在序列为空时作为默认值。
在 Python 3 中,您可以使用:
>>> from functools import reduce
>>> from operator import xor
>>> bits = ('0', '1', '0', '1', '0', '1', '0')
>>> reduce(xor, map(int, bits))
1
或者,如果您想要一个正在运行的XOR:
>>> from itertools import accumulate
>>> from operator import xor
>>> bits = ('0', '1', '0', '1', '0', '1', '0')
>>> list(accumulate(map(int, bits), xor))
[0, 1, 1, 0, 0, 1, 1]
如前所述, reduce
效果很好。 如果您阅读了reduce
,您会遇到fold的概念,它是一个高阶函数(如map
)。
在某些语言中,您可以向左或向右折叠。 有趣的是,在您的情况下,如果您从左侧或右侧开始,您会得到相同的结果,因为xor
是可交换和关联的。
如果您正在寻找不使用 reduce 或 lambda 函数的解决方案,请看一下这个版本
A = [1,1,2,3,4,4,5,5]
x = 0
for i in A:
x ^= i
print(x)
output : 3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.