集合
概念
无序、不重复元素的可变集合
- 集合中的元素必须是不可变类型
- 顺序与底层原理有关,不固定
- 不能通过索引访问,可遍历
创建
不能用
{}
创建集合,实际是空字典
python
# 使用{}
my_set1 = {1, 2, 3, 'a', 'b', 3, 2}
# 重复的元素 2 和 3 会被自动忽略
print(f"使用花括号创建: {my_set1}") # 使用花括号创建: {1, 2, 3, 'b', 'a'}
set() 构造函数
python
# 创建空
empty_set = set()
# 从list创建
list_data = [1, 2, 2, 'c', 'd', 'c']
set_from_list = set(list_data)
print(f"从列表转换: {set_from_list}") # 从列表转换: {'c', 1, 2, 'd'} (顺序可能不同)
# 元组转换为集合
tuple_data = ('x', 'y', 'z', 'x')
set_from_tuple = set(tuple_data)
print(f"从元组转换: {set_from_tuple}") # 输出 {'y', 'x', 'z'} (顺序可能不同)
# 从字符串转换 (每个字符作为元素)
string_data = "hello world"
set_from_string = set(string_data)
print(f"从字符串转换: {set_from_string}") # 从字符串转换: {'r', ' ', 'h', 'l', 'e', 'd', 'o', 'w'} (去重且无序)
操作
添加
.add(element)
: 向集合中添加单个元素。如果元素已存在,则不执行任何操作。.update(iterable)
: 将iterable
(如列表、元组、字符串或其他集合) 中的所有元素添加到集合中(会自动去重)
python
my_set = {1, 2, 3}
# 添加单个元素
my_set.add(4)
print(f"add(4) 后: {my_set}") # 输出 {1, 2, 3, 4}
# 添加已存在的元素
my_set.add(2)
print(f"add(2) 后 (无变化): {my_set}") # 输出 {1, 2, 3, 4}
# 使用 update 添加多个元素
my_set.update([4, 5, 6])
print(f"update([4, 5, 6]) 后: {my_set}") # 输出 {1, 2, 3, 4, 5, 6}
删除
.remove(element)
: 从集合中删除指定的元素。如果元素不存在于集合中,会引发KeyError
错误。.discard(element)
: 从集合中删除指定的元素。如果元素不存在于集合中,不会引发错误,而是静默处理。这是更安全的删除方式。.pop()
: 随机(或按某种内部顺序,但不能依赖)删除并返回集合中的一个元素。如果集合为空,会引发KeyError
。.clear()
: 清空集合,删除所有元素。
python
my_set = {'a', 'b', 'c', 'd', 'e'}
# 使用 remove 删除 'c'
my_set.remove('c')
print(f"remove('c') 后: {my_set}") # remove('c') 后: {'b', 'e', 'a', 'd'}
# 使用 discard 删除 'b'
my_set.discard('b')
print(f"\ndiscard('b') 后: {my_set}") # discard('b') 后: {'d', 'e', 'a'}
# 使用 pop 删除一个元素
popped_element = my_set.pop()
print(f"\npop() 后: {my_set}") # pop() 后: {'e', 'a'}
# 使用 clear 清空集合
my_set.clear()
print(f"\nclear() 后: {my_set}") # clear() 后: set()
运算
并集
set1 | set2
set1.union(set2, set3, ...)
: 返回包含所有集合中所有元素的新集合。
交集
set1 & set2
set1.intersection(set2, set3, ...)
: 返回包含所有集合中共有的元素的新集合。
差集
set1 - set2
set1.difference(set2, set3, ...)
: 返回包含在set1
中但不在其他集合中的元素的新集合。
python
set_a = {1, 2, 3, 4}
set_b = {3, 4, 5, 6}
set_c = {4, 5}
# 并集
union_ab = set_a | set_b
union_abc = set_a.union(set_b, set_c)
print(f"A | B: {union_ab}") # 输出 {1, 2, 3, 4, 5, 6}
# 交集
intersection_ab = set_a & set_b
print(f"\nA & B: {intersection_ab}") # 输出 {3, 4}
# 差集
difference_a_b = set_a - set_b
print(f"\nA - B: {difference_a_b}") # 输出 {1, 2} (在 A 但不在 B)
不可变集合
- 不可变,创建后无法修改。
- 因为不可变,所以
frozenset
对象可以作为字典的键或集合的元素。- 支持所有不修改集合的普通集合操作(如成员测试、len(), copy(), 数学运算 union, intersection 等)
python
# 创建 frozenset
frozen = frozenset([1, 2, 3, 2])
print(f"创建的 frozenset: {frozen}") # 创建的 frozenset: frozenset({1, 2, 3})
# 可以作为字典键
my_dict = {frozen: "value"}
print(f"以 frozenset 为键的字典: {my_dict}") # 以 frozenset 为键的字典: {frozenset({1, 2, 3}): 'value'}
# 支持非修改性操作
print(f"长度: {len(frozen)}") # 输出 3
print(f"2 是否在 frozenset 中? {2 in frozen}") # 输出 True
other_frozen = frozenset({3, 4, 5})
print(f"并集: {frozen.union(other_frozen)}") # 输出 frozenset({1, 2, 3, 4, 5})