如何查找列表的交集和联合(不使用集合)

时间:2018-04-12 05:12:16

标签: python union intersection

我正在尝试为作业找到两个列表的交集和并集,但是,我不能使用集合。根据集合论,两个集合之间的交集是两个集合中的元素。联合是两组中的所有元素,没有重复。到目前为止,我有:

setA = [1,2,3,4,5,6,7,8,9]
setB = [1,5,0,9]

def getUnion(a, b):
    return a + b

def getIntersection(a, b):
    return 

我的联合函数返回重复项。有没有办法简单地找到联盟?

此外,找到十字路口的最佳方法是什么?

4 个答案:

答案 0 :(得分:0)

试试这个:

setA = [1,2,3,4,5,6,7,8,9]
setB = [1,5,0,9]

print (list(set(setA).intersection(setB)))

输出:

[1, 5, 9]
[Finished in 0.0s]

答案 1 :(得分:0)

不使用集合的联合和交集:

setA = [1,2,3,4,5,6,7,8,9]
setB = [1,5,0,9]

intersection = [i for i in setA if i in setB]
list_union = list({i: i for i in setA + setB}.values())

print(intersection)
print(list_union)

输出:

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

<强>解释

对于工会:

[i for i in setA if i in setB]

只需遍历setA并添加setB

中也包含的元素

对于交叉点:

list({i: i for i in setA + setB}.values())

创建一个字典,其中键和值是setA + setB的结果。由于字典中的键是唯一的,因此重复字符不会显示在最终字典中,list(dct.values())用于仅提取字典中所需的值。

答案 2 :(得分:0)

因此,假设您可以使用sort。首先对两个列表进行排序,然后对两个指针进行排序,每次向前移动一个具有较小值的指针。

对于union func,每次都添加所有值,并在它们的值相等时向前移动两个指针。 对于交集函数,仅在值相等时添加值。

时间O(nlogn + n) - > O(nlogn)

答案 3 :(得分:0)

您可以使用collections.Counter来计算联合和交集

>>> from collections import Counter

>>> c = Counter(setA + setB)
>>> [a[0] for a in c.items() if a[1] > 1] #Intersection
>>> [1,5,9]

>>> list(c.keys()) #Union
>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Counter对象以格式保存数据:

>>> c
>>> Counter({1: 2, 5: 2, 9: 2, 0: 1, 2: 1, 3: 1, 4: 1, 6: 1, 7: 1, 8: 1})

键是列表中的元素,值是列表中元素的出现位置。