我有一个数字列表:
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")
我意识到我可能通过提出这样一个开放式问题来违反协议,但我完全被难倒了。
答案 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