在Python中的两个列表上进行异或

时间:2014-03-29 20:42:09

标签: python list python-2.7 xor

我是Python的初学者,我必须在两个列表之间进行异或(第一个长度为600,另外60个)

我真的不知道该怎么做,如果有人能解释我怎么样,那将是一种乐趣。

我必须这样做才能找到BPSK信号模块,我想知道如何使用两个长度不同的列表。我看到这篇文章:Comparing two lists and only printing the differences? (XORing two lists)但是列表的长度是相同的

感谢您的帮助,感谢我的英语不好 罗

2 个答案:

答案 0 :(得分:18)

鉴于序列seq1seq2,您可以使用

计算symmetric difference
set(seq1).symmetric_difference(seq2)

例如,

In [19]: set([1,2,5]).symmetric_difference([1,2,9,4,8,9])
Out[19]: {4, 5, 8, 9}

提示:使用较小的列表生成集通常更快:

In [29]: %timeit set(range(60)).symmetric_difference(range(600))
10000 loops, best of 3: 25.7 µs per loop

In [30]: %timeit set(range(600)).symmetric_difference(range(60))
10000 loops, best of 3: 41.5 µs per loop

您可能希望使用symmetric difference代替^(尽管其语法之美)的原因是因为symmetric difference方法可以将列表作为输入。 ^要求两个输入都是集合。将两个列表转换为集合的计算量比最低要求的计算量多一点。


此问题已标记为this question的副本 然而,这个问题是在不使用集合的情况下寻求解决这个问题的方法。

已接受的解决方案,

[a for a in list1+list2 if (a not in list1) or (a not in list2)]
如果允许集合,则不推荐使用

对两个列表进行异或。首先,它的速度慢了100多倍:

In [93]: list1, list2 = range(600), range(60)

In [94]: %timeit [a for a in list1+list2 if (a not in list1) or (a not in list2)]
100 loops, best of 3: 3.35 ms per loop

答案 1 :(得分:5)

设置了XOR运算符。假设您没有重复项(并且您不关心检查元素是否在第二个列表中出现超过1次),您可以在set上使用^运算符:

>>> set([1, 2, 3, 4, 5]) ^ set([1, 3, 4, 5, 6])
set([2, 6])
>>> set(range(80)) ^ set(range(60))
set([60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79])