使用XOR运算符确定整数列表中是否存在重复项

时间:2017-01-14 02:32:16

标签: python list xor

我有一个数字列表:

a = [1,2,3,4,5,19,22,25,17,6,73,72,71,77,899,887,44,124, ...]
#this is an abbreviated version of the list

我需要确定列表中是否有重复项,或者是否使用XOR(“^”)运算符。

任何人都可以给我任何提示吗?我是新手,从未遇到过这个问题或以前使用过XOR算子。

我尝试了几种方法(在黑暗中相当于盲目刺伤)。最后一个是:

MyDuplicatesList = [1,5,12,156,166,2656,6,4,5,9] #changed the list to make it easer
for x in MyDuplicatesList:
    if x^x:
    print("True")

我意识到我可能通过提出这样一个开放式问题来违反协议,但我完全被难倒了。

4 个答案:

答案 0 :(得分:3)

为什么选择XOR?

# true if there are duplicates
print len(set(a)) != len(a)

好的,这是pythonic。它找到所有重复项并列出它们。

a = [1,2,3,4,5,19,22,25,17,6,73,72,71,77,899,887,44,124,1]
b = [a[i] for i in range(len(a)) for j in range(i+1,len(a)) if i ^ j > 0 if a[i] ^ a[j] < 1]

print b

Dalen简化版的想法:

a = [1,2,3,4,5,19,22,25,17,6,73,72,71,77,899,887,44,124,1]

def simplifyDalen(source):
    dup = 0

    for x in source:
        for y in source:
            dup += x ^ y == 0

    return dup ^ len(source) > 0

result = simplifyDalen(a)

if result:
    print "There are duplicates!"
else:
    print "There are no duplicates!"

到目前为止,我的位索引想法是最快的(因为它的一次通过算法,我想,并不是很多)

答案 1 :(得分:3)

当你x两个相同的数字时,你得到0.你应该知道。

from operator import xor

def check (lst):
    dup = 0
    for x in lst:
        for y in lst:
            dup += xor(x, y)!=0
    l = len(lst)
    return dup!=(l**2 -l)

c = check([0,1,2,3,4,5,4,3,5])

if c:
    print "There are duplicates!"
else:
    print "There are no duplicates!"
顺便说一下,这是非常愚蠢的做法。 XORing很快,但O(n ** 2)(总是通过整套)是不必要的损失。 首先,遇到第一个重复时应该停止迭代。 另一方面,这应该使用set()或dict()来完成。 但你可以得到这个想法。

另外,使用xor()函数代替按位运算符&#39; ^&#39;减慢了一点。为了清楚起见,我做了它,因为我复杂了其余的代码。因此,人们知道它作为替代品存在。

这是一个如何做得更好的例子。 它是对Organis在评论中建议的代码的轻微修改。

def check (lst):
    l = len(lst)
    # I skip comparing first with first and last with last
    # to prevent 4 unnecessary iterations. It's not much, but it makes sense.
    for x in xrange(1, l):
        for y in xrange(l-1):
            # Skip elements on same position as they will always xor to 0  :D
            if x!=y: # Can be (if you insist): if x^y != 0:...
                if (lst[x] ^ lst[y])==0:
                    return 1 # Duplicate found
    return 0 # No duplicates

c = check([0,1,2,3,4,5,4,3,5])

if c:
    print "There are duplicates!"
else:
    print "There are no duplicates!"

重复一遍,XOR不能用于比较,至少不能用于高级编程语言。由于某些原因,你可能需要在装配中使用类似的东西,但是eq在任何地方都可以很好地工作。如果我们只是在这里使用==,我们将能够检查包含任何内容的列表中的重复项,而不仅仅是整数。

XOR非常适合其他用途,如普通的bitwising(屏蔽,取消屏蔽,更改位......),所以在加密系统和类似的东西中。

答案 2 :(得分:1)

XOR采用数字的二进制再进行,然后逐位比较,如果两位不同则输出1,否则输出0。示例:1 ^ 2 = 3,因为在二进制1中是01而2是10,因此逐位比较我们得到11或3.对一个数字本身总是给出0,所以我们可以使用这个属性来检查两个数字是相同的。有多种更好的方法来检查列表中的重复项而不是使用XOR,但如果您希望/需要这样做,希望以上信息可以让您了解从哪里开始。

答案 3 :(得分:1)

好吧,让我们使用列表项作为位索引:

def dupliXor(source):
    bigs = 0

    for x in source:
        b = 1<<x
        nexts = bigs ^ b

        # if xor removes the bit instead
        # of adding it then it is duplicate
        if nexts < bigs:
            print True
            return

        bigs = nexts

    print False

a = [1,2,3,4,5,19,22,25,17,6,73,72,71,77,899,887,44,124,1]

dupliXor(a) # True

a = [1,2,3,4,5,19,22,25,17,6,73,72,71,77,899,887,44,124]

dupliXor(a) # False