Python 集合(Set)是一种无序、可变的容器,用于存储唯一的元素(无重复值)。以下是关于集合的所有基础知识:
1. 集合的定义
集合使用大括号 {} 定义,元素之间用逗号分隔,也可以通过 set() 函数创建:
# 普通集合
numbers = {
1, 2, 3, 4, 5}
fruits = {
"apple", "banana", "cherry"}
# 空集合(必须用 set(),不能用 {},后者会被视为空字典)
empty_set = set()
# 从其他可迭代对象创建集合
list_to_set = set([1, 2, 3, 3, 4]) # {1, 2, 3, 4}(自动去重)
str_to_set = set("hello") # {'h', 'e', 'l', 'o'}(字符去重)
集合的特性:
- 元素唯一:自动去除重复值
- 无序性:元素没有固定顺序,不能通过索引访问
- 元素必须可哈希:如字符串、数字、元组等,列表等可变类型不能作为元素
2. 集合的基本操作
添加元素:
fruits = { "apple", "banana"} fruits.add("cherry") # 添加单个元素 print(fruits) # {'apple', 'banana', 'cherry'} # 添加多个元素(可迭代对象) fruits.update(["orange", "grape"]) print(fruits) # {'apple', 'banana', 'cherry', 'orange', 'grape'}删除元素:
fruits = { "apple", "banana", "cherry"} # remove():删除指定元素,不存在则报错 fruits.remove("banana") # discard():删除指定元素,不存在也不报错 fruits.discard("orange") # pop():随机删除并返回一个元素(集合无序,无法预测删除哪个) removed = fruits.pop() # clear():清空集合 fruits.clear()集合长度:
print(len({ 1, 2, 3, 4})) # 4检查元素是否存在:
fruits = { "apple", "banana"} print("apple" in fruits) # True print("orange" not in fruits) # True
3. 集合的运算
集合支持多种数学集合运算:
并集:两个集合中所有元素的组合(去重)
a = { 1, 2, 3} b = { 3, 4, 5} print(a | b) # {1, 2, 3, 4, 5} print(a.union(b)) # 同上交集:两个集合中共同存在的元素
print(a & b) # {3} print(a.intersection(b)) # 同上差集:属于第一个集合但不属于第二个集合的元素
print(a - b) # {1, 2} print(a.difference(b)) # 同上对称差集:属于两个集合中的任意一个但不同时属于两个集合的元素
print(a ^ b) # {1, 2, 4, 5} print(a.symmetric_difference(b)) # 同上
4. 集合的关系判断
a = {
1, 2, 3, 4}
b = {
2, 3}
c = {
5, 6}
# 子集:b 是 a 的子集吗?
print(b.issubset(a)) # True
print(b <= a) # True
# 超集:a 是 b 的超集吗?
print(a.issuperset(b)) # True
print(a >= b) # True
# 不相交:a 和 c 没有共同元素吗?
print(a.isdisjoint(c)) # True(无交集)
5. 集合推导式
一种简洁创建集合的方式:
# 基本形式:{表达式 for 变量 in 可迭代对象}
squares = {
x**2 for x in range(10)} # {0, 1, 4, 9, 16, 25, 36, 49, 64, 81}
# 带条件的集合推导式
even_numbers = {
x for x in range(20) if x % 2 == 0} # {0, 2, 4, ..., 18}
# 从字符串创建并去重
unique_chars = {
c for c in "hello world" if c != " "} # {'h', 'e', 'l', 'o', 'w', 'r', 'd'}
6. 冻结集合(Frozenset)
冻结集合是不可变的集合,创建后不能修改,可作为字典的键或其他集合的元素:
# 创建冻结集合
fs = frozenset([1, 2, 3, 4])
# 冻结集合不能添加/删除元素
# fs.add(5) # 报错
# 可以进行集合运算
fs2 = frozenset([3, 4, 5])
print(fs & fs2) # frozenset({3, 4})
# 可以作为字典的键
d = {
fs: "frozenset as key"}
7. 集合的应用场景
去重:快速去除列表等可迭代对象中的重复元素
lst = [1, 2, 2, 3, 3, 3] unique_lst = list(set(lst)) # [1, 2, 3](注意顺序可能改变)成员关系测试:判断元素是否存在(集合的查找效率高于列表)
集合运算:如找出两个列表的共同元素、不同元素等
list1 = [1, 2, 3, 4] list2 = [3, 4, 5, 6] common = list(set(list1) & set(list2)) # [3, 4]数据过滤:筛选符合条件的唯一元素
集合是处理唯一性数据和集合运算的理想选择,其内部实现为哈希表,因此查找、添加和删除元素的效率都很高(平均时间复杂度为 O(1))。在需要处理大量元素且关注唯一性或集合关系时,使用集合会比列表更高效。