Skip to content

集合

概念

无序不重复元素的可变集合

  • 集合中的元素必须是不可变类型
  • 顺序与底层原理有关,不固定
  • 不能通过索引访问,可遍历

创建

不能用{}创建集合,实际是空字典

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})