繁体   English   中英

列表/元组元素的异或

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM