Python中两个列表的异或操作

25

我是Python的初学者,需要对两个列表进行异或操作(第一个长度为600,另一个长度为60)。

我真的不知道如何做到这一点,如果有人能解释一下,那将是一件很愉快的事情。

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

感谢您的帮助,抱歉我的英语不好。 Rom


请参见以下链接:https://dev59.com/TGQo5IYBdhLWcg3wG8SE - Kevin Johnson
请注意,问题https://dev59.com/TGQo5IYBdhLWcg3wG8SE有一个额外的要求,即不能使用集合。这个问题没有强制执行该要求。如果允许使用集合,则可以使用更简单和更快速的解决方案。 - unutbu
2个回答

50

提供序列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
使用对称差异而不是^(尽管其语法美丽)的原因是对称差异方法可以将列表作为输入。^要求两个输入都是集合。将两个列表都转换为集合,比最小需求的计算量稍微多一些。

这个问题被标记为这个问题的副本。 然而,那个问题寻求在不使用集合的情况下解决此问题的方案。

已接受的解决方案:

[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
非常好的且详尽的回答! - holzkohlengrill

20

在集合中有一个XOR运算符。假设您没有重复项(并且您不关心在第二个列表中一个元素是否出现多次或不止一次),则可以在集合上使用^运算符:

Translated content:

在集合中有一个XOR运算符。假设您没有重复项(并且您不关心在第二个列表中一个元素是否出现多次或不止一次),则可以在集合上使用^运算符:

>>> 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])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接