集合
集合(set)是由不重复元素组成的无序容器。核心用途包括成员检测和消除重复元素,同时支持数学上的并集、交集、差集、对称差等运算。集合底层基于哈希表实现,成员检测的平均时间复杂度为 O(1)。
创建集合
非空集合可用花括号 {} 创建:
basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
print(basket) # {'orange', 'banana', 'pear', 'apple'},重复自动去重
空集合只能用 set() 创建,{} 创建的是空字典:
empty = set() # ✅ 空集合
not_set = {} # ❌ 这是空字典
set() 可从任何可迭代对象创建集合,常用于列表去重:
nums = [1, 2, 2, 3, 3, 3]
set(nums) # {1, 2, 3}
set("abracadabra") # {'a', 'r', 'b', 'c', 'd'}
注意,集合去重会丢失原始顺序。Python 3.7+ 中如需保持顺序去重,可用 list(dict.fromkeys(nums))。
成员检测
集合的成员检测 in 平均为 O(1),远快于列表的 O(n):
basket = {'apple', 'orange', 'pear'}
'orange' in basket # True
'crabgrass' in basket # False
集合运算
集合支持丰富的数学运算,既有运算符写法,也有方法调用写法:
a = set('abracadabra') # {'a', 'r', 'b', 'c', 'd'}
b = set('alacazam') # {'a', 'l', 'c', 'z', 'm'}
a | b # 并集:{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
a & b # 交集:{'a', 'c'}
a - b # 差集:{'r', 'd', 'b'}
a ^ b # 对称差:{'r', 'd', 'b', 'm', 'z', 'l'}
子集和超集判断:
a = {1, 2}
b = {1, 2, 3}
a < b # True,真子集
a <= b # True,子集
b > a # True,真超集
a.isdisjoint({4, 5}) # True,无共同元素
集合方法:增删改查
s = {1, 2, 3}
s.add(4) # 添加单个元素
s.update([5, 6]) # 批量添加,接受列表、集合、range等
s.remove(3) # 删除,不存在时抛出 KeyError
s.discard(99) # 安全删除,不存在时不报错
s.pop() # 随机删除并返回一个元素,空集合报错
s.clear() # 清空
frozenset
frozenset 是集合的不可变版本,可哈希,能作为字典的键或其他集合的元素:
frozen = frozenset(['a', 'b', 'c'])
d = {frozen: "letters"}
s = {frozenset([1, 2]), frozenset([3, 4])}
支持所有非修改性集合运算,返回新的 frozenset 对象。
集合推导式
语法为 {expression for item in iterable if condition}:
{x for x in 'abracadabra' if x not in 'abc'} # {'r', 'd'}
{w.lower() for w in ['Apple', 'Banana']} # {'apple', 'banana'}
元素类型限制
集合只能存放可哈希的不可变元素:
s = set()
s.add([1, 2]) # TypeError: unhashable type: 'list'
s.add((1, 2)) # ✅,元组可哈希