集合简介
什么是集合?
集合是一个无序的、不重复的数据集合,它具有以下特点:
- 唯一性:集合中的元素都是唯一的,不会重复
- 无序性:集合中的元素没有固定的顺序
- 可变性:可以添加或删除元素
- 异构性:可以包含不同类型的不可变数据
使用场景
- 去重:快速删除重复元素
- 成员检测:高效的元素查找
- 数学运算:交集、并集、差集等集合运算
- 数据过滤:筛选符合条件的元素
创建集合
创建集合的多种方式
# 使用花括号创建
numbers = {1, 2, 3, 4, 5}
mixed = {1, "hello", 3.14, True}
# 使用set()函数创建
empty_set = set() # 创建空集合
list_to_set = set([1, 2, 2, 3, 3, 4]) # 从列表创建
string_to_set = set("hello") # 从字符串创建
# 集合自动去重
duplicates = {1, 2, 2, 3, 3, 3}
print(duplicates) # 输出: {1, 2, 3}
# 使用集合推导式
squares = {x**2 for x in range(5)}
print(squares) # 输出: {0, 1, 4, 9, 16}
注意事项
- 空集合必须使用set()创建,因为{}表示空字典
- 集合中的元素必须是不可变类型(如数字、字符串、元组)
- 列表、字典等可变类型不能作为集合元素
集合运算
基本集合运算
# 创建示例集合
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
# 并集
union = set1 | set2 # 或使用 set1.union(set2)
print(f"并集: {union}") # {1, 2, 3, 4, 5, 6, 7, 8}
# 交集
intersection = set1 & set2 # 或使用 set1.intersection(set2)
print(f"交集: {intersection}") # {4, 5}
# 差集
difference = set1 - set2 # 或使用 set1.difference(set2)
print(f"差集: {difference}") # {1, 2, 3}
# 对称差集
symmetric_diff = set1 ^ set2 # 或使用 set1.symmetric_difference(set2)
print(f"对称差集: {symmetric_diff}") # {1, 2, 3, 6, 7, 8}
# 子集和超集判断
subset = {1, 2}
print(f"是否为子集: {subset <= set1}") # True
print(f"是否为真子集: {subset < set1}") # True
print(f"是否为超集: {set1 >= subset}") # True
常用方法
集合的基本操作
# 创建示例集合
fruits = {"apple", "banana", "orange"}
# 添加元素
fruits.add("grape")
print(fruits) # 添加单个元素
fruits.update(["kiwi", "mango"])
print(fruits) # 添加多个元素
# 删除元素
fruits.remove("apple") # 元素不存在会报错
fruits.discard("pear") # 元素不存在不会报错
popped = fruits.pop() # 随机移除一个元素
fruits.clear() # 清空集合
# 复制集合
fruits = {"apple", "banana", "orange"}
fruits_copy = fruits.copy()
# 成员检测
print("apple" in fruits) # True
print("pear" not in fruits) # True
# 遍历集合
for fruit in fruits:
print(fruit)
实际应用
数据去重
# 列表去重
numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique_numbers = list(set(numbers))
print(f"去重后: {unique_numbers}")
# 字符串去重
text = "hello world"
unique_chars = "".join(sorted(set(text)))
print(f"唯一字符: {unique_chars}")
# 保持原顺序去重
def remove_duplicates(items):
seen = set()
return [x for x in items if not (x in seen or seen.add(x))]
original = [1, 3, 2, 3, 1, 4, 2]
result = remove_duplicates(original)
print(f"保序去重: {result}")
共同元素查找
# 查找多个列表的共同元素
def find_common_elements(*lists):
"""查找多个列表中的共同元素"""
if not lists:
return set()
# 将所有列表转换为集合并求交集
sets = [set(lst) for lst in lists]
return sets[0].intersection(*sets[1:])
# 使用示例
list1 = [1, 2, 3, 4, 5]
list2 = [4, 5, 6, 7, 8]
list3 = [3, 4, 5, 9, 10]
common = find_common_elements(list1, list2, list3)
print(f"共同元素: {common}") # {4, 5}
高级特性
不可变集合(frozenset)
# 创建不可变集合
frozen = frozenset([1, 2, 3])
# 可以作为字典的键或其他集合的元素
sets = {frozen, frozenset([4, 5, 6])}
dict_with_sets = {frozen: "不可变集合"}
# 支持所有不修改集合的操作
print(frozen & {2, 3, 4}) # 交集操作
print(frozen | {4, 5, 6}) # 并集操作
# 不支持修改操作
# frozen.add(4) # 这会报错
集合的性能优化
# 使用集合优化查找性能
def find_duplicates(numbers):
"""查找列表中的重复元素"""
seen = set()
duplicates = set()
for num in numbers:
if num in seen:
duplicates.add(num)
else:
seen.add(num)
return duplicates
# 性能测试
import time
numbers = list(range(1000)) + list(range(500))
start = time.time()
duplicates = find_duplicates(numbers)
end = time.time()
print(f"重复元素: {duplicates}")
print(f"耗时: {(end - start)*1000:.2f}ms")