从2个列表中收集唯一值

时间:2016-07-08 16:31:39

标签: python python-2.7

我目前有两个“集合”列表,两者都包含大多数相同的值,即:

a = [1,2,3,4,5,6]

b = [1,2,3,4,5,6,7,8]

我要做的是比较两者,只返回7& 8但是我没有运气,我已经尝试了一些我在这里找到的方法,例如:

c = [item for item in a if item not in b]

然而,我没有运气,有没有人知道一个快速而相当简单的方法呢?之前两个列表都已“设置”以删除其自己列表中的任何重复项(只是觉得我应该添加,如果这有所不同)

为了清楚起见,因为我觉得我并不后悔,示例值已经处于设置格式,出于某种原因,当我在列表中使用set时,它的行为就像是array_unique PHP函数。

感谢。

3 个答案:

答案 0 :(得分:2)

您可以使用套装:

set(b) - set(a)
Out[65]: {7, 8}

或更明确地说:

set(b).difference(a)
Out[67]: {7, 8}

对于对称差异,您可以使用^。它将返回a或b中的元素,但不返回两者中的元素。假设a有一个额外的元素,9:

a = [1, 2, 3, 4, 5, 6, 9]
b = [1, 2, 3, 4, 5, 6, 7, 8]
set(b) ^ set(a)
Out[70]: {7, 8, 9}

或者,

set(b).symmetric_difference(a)
Out[71]: {7, 8, 9}

如果已经设置,则可以b - ab ^ a

您的尝试无效,因为a中的任何项目都不在b中。对于这种差异(b-a),您需要:[item for item in b if item not in a]

答案 1 :(得分:0)

另一种方法是使用defaultdict来计算两个列表中每个元素的出现次数:

from collections import defaultdict
from itertools import chain

a = [1,2,3,4,5,6,9]

b = [1,2,3,4,5,6,7,8,9]

d = defaultdict(int)

for num in chain(a, b):
    d[num] += 1


print([key for key, value in d.items() if value == 1])

输出:

[7, 8]

答案 2 :(得分:-1)

list(set(a)-set(b))+list(set(b)-set(a))