Python中两个列表的异或[重复]
Posted
技术标签:
【中文标题】Python中两个列表的异或[重复]【英文标题】:XOR on two lists in Python [duplicate] 【发布时间】:2014-05-09 07:41:17 【问题描述】:我是 Python 的初学者,我必须在两个列表之间进行 XOR(第一个长度为 600,另一个为 60)
我真的不知道该怎么做,如果有人能解释一下,那将是一种乐趣。
我必须这样做才能找到 BPSK 信号模块,我想知道如何处理两个长度不同的列表。我看到了这个帖子:Comparing two lists and only printing the differences? (XORing two lists) 但是列表的长度是一样的
感谢您的帮助,并为我糟糕的英语感到抱歉 罗
【问题讨论】:
见***.com/questions/16312730/… 注意问题***.com/questions/16312730/…有额外的要求不能使用set。这个问题没有强加这个要求。如果允许集合,则可以实现更简单、更快的解决方案。 【参考方案1】:给定序列seq1
和seq2
,您可以计算出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
【讨论】:
伟大而彻底的答案!【参考方案2】:现场有XOR
操作员。假设您没有重复项(并且您不关心检查元素是否在第二个列表中出现超过 1 次),您可以在集合上使用 ^
运算符:
>>> 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])
【讨论】:
以上是关于Python中两个列表的异或[重复]的主要内容,如果未能解决你的问题,请参考以下文章