首页 > 解决方案 > 列表中的单个元素

问题描述

我对python相当陌生,我发现这段代码是为了在列表中找到一个元素

这是代码:

def single_number(arr):
    ones, twos = 0, 0
    for x in arr:
        ones, twos = (ones ^ x) & ~twos, (ones & x) | (twos & ~x)
    assert twos == 0
    return ones
arr1 = [5, 3, 4, 3, 5, 5, 3]
print(single_number(arr1))

我似乎无法理解这条线在做什么

ones, twos = (ones ^ x) & ~twos, (ones & x) | (twos & ~x)
assert twos==0

标签: pythonpython-3.xbit-manipulation

解决方案


该行的目的是实现一个操作,如果对输入应用三次,则返回原始值,如果应用一次,则保留输入。

如果我们想从包含对而不是三元组的数组中选择单个值,则更容易理解。那我们就可以做...

ones = ones ^ x

...因为 y ^ x ^ x == y。所以所有的对都抵消了,你只剩下一个值。

正如其他人所评论的那样,三项案例是一种非常讨厌的晦涩技巧,只有在性能至关重要且问题非常具体时才应使用。

我认为断言只是试图确认满足前提条件,即除了一个之外,所有数字都是三元组。这不是万无一失的。


推荐阅读