【问题标题】:XOR on two lists in Python [duplicate]Python中两个列表的异或[重复]
【发布时间】:2014-05-09 07:41:17
【问题描述】:

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

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

我必须这样做才能找到 BPSK 信号模块,我想知道如何处理两个长度不同的列表。我看到了这个帖子:Comparing two lists and only printing the differences? (XORing two lists) 但是列表的长度是一样的

感谢您的帮助,并为我糟糕的英语感到抱歉 罗

【问题讨论】:

标签: python list python-2.7 xor


【解决方案1】:

给定序列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

【讨论】:

  • 伟大而彻底的答案!
【解决方案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])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 2018-08-30
    • 1970-01-01
    相关资源
    最近更新 更多