我正在尝试为作业找到两个列表的交集和并集,但是,我不能使用集合。根据集合论,两个集合之间的交集是两个集合中的元素。联合是两组中的所有元素,没有重复。到目前为止,我有:
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
我的联合函数返回重复项。有没有办法简单地找到联盟?
此外,找到十字路口的最佳方法是什么?
答案 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})
键是列表中的元素,值是列表中元素的出现位置。