集合型对象(Set&Frozenset)

一. 集合基础

集合(set)是一种无序且可变类型的容器。

可以将集合看作是字典的一种特殊形式——由字典的 Keys 所组成的列表。因此集合具备两个核心特征:其一,集合内的元素必须是不可变对象类型(如数字、字符串、元组);其二,集合内的元素不能重复。

冻集合(frozenset)则是集合的不可变版本,除了不支持修改(增、删)操作外,其他基本性质与运算和集合完全一致。

1. 集合与冻集合的创建

(1). 集合的直接创建

使用大括号 {} 进行标注,元素之间用逗号隔开。

# 直接创建集合
s1 = {1, 2, 3}

# 无序性及包含不同类型(必须是不可变类型)的体现
s2 = {1, 2, 'Hi', (1, 2, 3)}

# 注:由于 {} 表示空字典,创建空集合必须使用 set()
s_empty = set()
(2). 使用 set() 函数

可将列表、元组、字符串、range 等可迭代对象转化为集合。

# 列表转集合
set([1, 2, 3])     # {1, 2, 3}

# 字符串转集合(会被拆分为单个字符并去重)
set('Hello')       # {'H', 'e', 'l', 'o'}
(3). 冻集合的使用 (frozenset)

冻集合只能通过 frozenset() 函数进行创建。一旦创建,其内部元素不可被修改或删除。

# 将列表或集合转化为冻集合
fr1 = frozenset([1, 2, 3])
fr2 = frozenset({1, 2, 3})

# 注:冻集合作为不可变对象,自身也可以作为另一个集合的元素
set([1, 2, frozenset([1, 2])]) 
(4). 利用集合去重

利用集合元素不可重复的特性,可以非常方便地对列表进行去重操作。注:去重过程会自动调整元素顺序,本质上是无序变量转化为有序变量。

l1 = [1, 1, 2, 3]
# 转化为集合去重,再转化为列表
ls1 = list(set(l1))  # [1, 2, 3]

二. 集合的常用方法与操作

1. add - 添加元素

作用:在集合中添加一个新元素。由于集合无序,因此没有特定的插入位置。冻集合不支持此方法。

set.add(elem)

参数:

  • 元素 (elem): 需要添加到集合中的目标对象(Any,必须是不可变类型)。

返回值:

  • 成功: 无返回值(NoneType),直接在原集合对象上进行修改。

示例:

s1 = {1, 2, 3}
# 在 s1 集合中添加元素 4
s1.add(4)
# s1 变为 {1, 2, 3, 4}

2. remove - 删除指定元素

作用:删除集合中指定的元素。若指定元素不存在,则会报错。冻集合不支持此方法。

set.remove(elem)

参数:

  • 元素 (elem): 需要从集合中移除的目标对象(Any)。

返回值:

  • 成功: 无返回值(NoneType),直接在原集合对象上进行修改。

示例:

s1 = {1, 2, 3, 4}
# 删除集合中的 4
s1.remove(4)
# s1 变为 {1, 2, 3}

3. pop - 随机弹出元素

作用:随机删除并返回集合中的一个元素(实际是按照内部哈希重排列后的顺序进行删除)。冻集合不支持此方法。

set.pop()

参数:

  • 无参数(None)。

返回值:

  • 成功: 返回被弹出的那个元素对象(Any)。如果集合为空则会报错。

示例:

s2 = {(1, 2), 1, 2, 'Hi'}
# 随机删除一个元素,并将其返回
val = s2.pop() 
# val 可能变为(1, 2)
# s2 变为 {1, 2, 'Hi'}

4. intersection或& - 交集运算

作用:提取出两个或多个集合中共同拥有的元素。

set1 & set2
set.intersection(other)

参数:

  • 其他集合 (other): 参与交集运算的其他可迭代对象(Iterable,如 set 或 frozenset)。

返回值:

  • 成功: 返回一个新的集合对象(set 或 frozenset),包含两者共同的元素。
  • 注: 还可以使用 intersection_update() 直接在原集合上覆盖更新,不返回新集合。

示例:

s1 = {1, 2, 3}
s2 = {2, 3, 4}

# 使用运算符 & 或 intersection 方法
s1 & s2                 # 返回 {2, 3}
s1.intersection(s2)     # 返回 {2, 3}

# 使用 intersection_update 方法(原地修改)
s1.intersection_update(s2)   # s1 变为 {2, 3}

5. union或| - 并集运算

作用:将两个集合中的所有元素合并在一起,并自动去重。

set1 | set2
set.union(other)

参数:

  • 其他集合 (other): 参与并集运算的其他可迭代对象(Iterable)。

返回值:

  • 成功: 返回一个新的集合对象(set 或 frozenset),包含两者的所有去重元素。
  • 注: 还可以使用 update() 方法直接将新元素并入原集合,不返回新集合。

示例:

s1 = {1, 2, 3}
s2 = {2, 3, 4}

# 使用运算符 | 或 union 方法
s1 | s2                 # 返回 {1, 2, 3, 4}
s1.union(s2)            # 返回 {1, 2, 3, 4}

# 使用 update 方法(原地修改)
s1.update(s2)           # s1 变为 {1, 2, 3, 4}

6. difference或- - 差集运算

作用:提取出存在于当前集合中,但不存在于另一个集合中的元素(当前集合减去共同部分)。

set1 - set2
set.difference(other)

参数:

  • 其他集合 (other): 参与差集运算的其他可迭代对象(Iterable)。

返回值:

  • 成功: 返回一个新的集合对象(set 或 frozenset)。
  • 注: 还可以使用 difference_update() 直接在原集合上覆盖更新。

示例:

s1 = {1, 2, 3}
s2 = {2, 3, 4}

# 存在于 s1 中但不在 s2 中的元素
s1 - s2                 # 返回 {1}
s1.difference(s2)       # 返回 {1}

# 使用 difference_update 方法(原地修改)
s1.difference_update(s2)   # s1 变为 {1}

7. symmetric_difference或^ - 补集运算 (对称差集)

作用:提取出两个集合中不重复的元素集合(即两者并集减去两者的交集)。

set1 ^ set2
set.symmetric_difference(other)

参数:

  • 其他集合 (other): 参与补集运算的其他可迭代对象(Iterable)。

返回值:

  • 成功: 返回一个新的集合对象(set 或 frozenset)。
  • 注: 还可以使用 symmetric_difference_update() 直接在原集合上覆盖更新。

示例:

s1 = {1, 2, 3}
s2 = {2, 3, 4}

# 提取不重复的独立元素
s1 ^ s2                        # 返回 {1, 4}
s1.symmetric_difference(s2)    # 返回 {1, 4}

# 使用 symmetric_difference_update 方法(原地修改)
s1.symmetric_difference_update(s2)   # s1 变为 {1, 4}

8. issubset - 子集判断

作用:判断当前集合是否被完全包含在另一个集合中。

set.issubset(other)

参数:

  • 其他集合 (other): 作为父集参考的目标容器(Iterable)。

返回值:

  • 成功: 如果被完全包含则返回 True,否则返回 False(bool)。

示例:

s1 = {1, 2, 3}
s2 = {2, 3}

# 判断 s2 是否是 s1 的子集
s2.issubset(s1)  # 返回 True

9. issuperset - 超集判断

作用:判断当前集合是否完全包含了另一个集合。

set.issuperset(other)

参数:

  • 其他集合 (other): 作为子集参考的目标容器(Iterable)。

返回值:

  • 成功: 如果完全包含对方则返回 True,否则返回 False(bool)。

示例:

s1 = {1, 2, 3}
s2 = {2, 3}

# 判断 s1 是否包含了 s2
s1.issuperset(s2)  # 返回 True

10. isdisjoint - 无交集判断

作用:判断两个集合是否完全没有共同元素(即是否有交集)。

set.isdisjoint(other)

参数:

  • 其他集合 (other): 需要参与对比的另一集合(Iterable)。

返回值:

  • 成功: 如果两个集合完全没有交集,则返回 True;如果有任何相同元素,则返回 False(bool)。

示例:

s3 = {1, 2}
s4 = {3}

# 判断 s3 和 s4 是否完全不相交
s3.isdisjoint(s4)  # 返回 True
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐