list1 = [1, 2, 2, 3, 4, 4, 5]
list2 = [3, 3, 4, 5, 6, 7]
set1 = set(list1)
set2 = set(list2)
# 相同的元素(交集)
common_elements = set1.intersection(set2)
# 所有的元素(并集)
all_elements = set1.union(set2)
# 只在其中一个列表中出现的元素(对称差集)
unique_elements = set1.symmetric_difference(set2)
print("相同的元素:", common_elements)
print("所有的元素:", all_elements)
print("只在其中一个列表中出现的元素:", unique_elements)
集合在这些操作中的优势和原理
- 优势:
- 去重高效:集合中的元素具有唯一性,将列表转换为集合时,重复元素会自动被去除,这比手动遍历列表去重的代码更简洁,并且在时间复杂度上通常更优(平均情况下,向集合中添加元素的时间复杂度接近 O(1),而手动遍历去重时间复杂度为 O(n))。
- 逻辑运算简洁:集合提供了直接的交集、并集、差集等逻辑运算方法,代码简洁明了,易于理解和编写。
- 原理:
- 交集:集合的交集运算,是找出同时存在于两个集合中的元素。其原理是通过对两个集合的元素进行比对,保留共同的元素。在实现上,集合通常采用哈希表等数据结构,查找元素的时间复杂度平均为 O(1),因此交集运算的时间复杂度为 O(min(len(set1), len(set2)))。
- 并集:并集运算是将两个集合中的所有元素合并在一起,去除重复元素。它会遍历两个集合,将所有元素添加到一个新的集合中,时间复杂度为 O(len(set1) + len(set2))。
- 差集:差集运算会找出只在一个集合中存在,而不在另一个集合中存在的元素。对于
set1 - set2
,会遍历set1
,检查每个元素是否在set2
中,若不在则保留,时间复杂度为 O(len(set1))(假设查找set2
中的元素平均时间复杂度为 O(1))。对称差集set1.symmetric_difference(set2)
则是找出只在其中一个集合中出现的元素,它等同于(set1 - set2).union(set2 - set1)
,时间复杂度为 O(len(set1) + len(set2))。