Python-什么是集合

发布于:2025-07-03 ⋅ 阅读:(31) ⋅ 点赞:(0)

一、前言

在 Python 中,除了我们常用的列表(list)、元组(tuple)和字典(dict),还有一种非常实用的数据结构 —— 集合(set)

集合是一种无序且不重复的元素集合,常用于去重、交并差运算等场景。本文将带你全面了解 Python 中集合的基本用法、操作方法及其适用场景,并通过大量代码示例帮助你掌握这一重要数据类型。

二、什么是集合(set)?

✅ 定义:

集合是 Python 中的一种可变数据类型,它存储的是一组无序且不重复的元素

⚠️ 特点:

  • 元素不可重复(自动去重)
  • 元素是无序的(不能通过索引访问)
  • 可以进行数学中的集合运算(如交集、并集、差集等)

✅ 示例:

s = {1, 2, 3, 4}
print(s)  # 输出: {1, 2, 3, 4}

三、创建集合的方式

✅ 1. 使用大括号 {} 创建集合

s = {1, 2, 3, 4}

⚠️ 注意:空集合不能使用 {},这会创建一个空字典(dict)!

empty_dict = {}      # 空字典
empty_set = set()    # 空集合

✅ 2. 使用 set() 函数转换其他序列

s1 = set([1, 2, 3, 2])     # 从列表转集合,自动去重
s2 = set("hello")           # 从字符串转集合
s3 = set((1, 2, 3, 2))      # 从元组转集合

print(s1)  # 输出: {1, 2, 3}
print(s2)  # 输出: {'h', 'e', 'l', 'o'}
print(s3)  # 输出: {1, 2, 3}

四、集合的常用操作方法

✅ 1. 添加元素:add()

s = {1, 2, 3}
s.add(4)
print(s)  # 输出: {1, 2, 3, 4}

✅ 2. 删除元素:remove() / discard()

s = {1, 2, 3}

s.remove(2)
print(s)  # 输出: {1, 3}

s.discard(4)  # 不会报错

⚠️ 区别:

  • remove(x):如果元素不存在,会抛出 KeyError
  • discard(x):不会抛出异常,更安全

✅ 3. 清空集合:clear()

s = {1, 2, 3}
s.clear()
print(s)  # 输出: set()

✅ 4. 集合运算(交集、并集、差集、对称差集)

运算 方法 符号 说明
并集 union() ` `
交集 intersection() & 共同元素
差集 difference() - 属于 A 但不属于 B 的元素
对称差集 symmetric_difference() ^ 不同时属于两个集合的元素
示例代码:
a = {1, 2, 3}
b = {3, 4, 5}

print(a.union(b))            # 输出: {1, 2, 3, 4, 5}
print(a.intersection(b))     # 输出: {3}
print(a.difference(b))       # 输出: {1, 2}
print(a.symmetric_difference(b))  # 输出: {1, 2, 4, 5}

五、集合与其他数据结构的对比

特性 列表(list 元组(tuple 字典(dict 集合(set
是否有序 ✅ 是 ✅ 是 ❌ 否(Python 3.7+为插入顺序) ❌ 否
是否可变 ✅ 是 ❌ 否 ✅ 是(键不变,值可变) ✅ 是
是否允许重复 ✅ 允许 ✅ 允许 ❌ 键不允许重复 ❌ 不允许重复
是否支持索引 ✅ 支持 ✅ 支持 ❌ 不支持 ❌ 不支持
主要用途 存储有序数据 存储固定数据 存储键值对 去重、集合运算

六、集合的实际应用场景

✅ 场景1:去除列表中的重复元素

nums = [1, 2, 2, 3, 4, 4, 5]
unique_nums = list(set(nums))
print(unique_nums)  # 输出: [1, 2, 3, 4, 5](顺序可能变化)

⚠️ 注意:使用 set 会丢失原有顺序,若需保留顺序可使用如下方式:

nums = [1, 2, 2, 3, 4, 4, 5]
unique = []
for n in nums:
    if n not in unique:
        unique.append(n)
print(unique)  # 输出: [1, 2, 3, 4, 5]

✅ 场景2:判断两个集合是否相交

a = {1, 2, 3}
b = {3, 4, 5}
if a & b:
    print("两个集合有交集")
else:
    print("没有交集")

✅ 场景3:找出所有用户标签的唯一集合

user1_tags = {"python", "web", "data"}
user2_tags = {"java", "web", "mobile"}

all_tags = user1_tags | user2_tags
print(all_tags)  # 输出: {'python', 'web', 'data', 'java', 'mobile'}

七、注意事项与常见错误

场景 建议
集合中能否包含列表? ❌ 不可以,集合中的元素必须是不可变类型(如数字、字符串、元组)
集合是否可哈希? ❌ 普通集合不可哈希,但 frozenset 是可哈希的
如何判断集合是否为空? ✅ 使用 len(s) == 0 或 not s
集合是否支持切片操作? ❌ 不支持,因为集合是无序的
性能优化建议 ✅ 查找元素是否在集合中比列表快得多(O(1) vs O(n))

八、冻结集合(frozenset)

如果你希望创建一个不可变的集合,可以用 frozenset()

fs = frozenset([1, 2, 3])
fs.add(4)  # 报错:AttributeError: 'frozenset' object has no attribute 'add'

✅ 优势:

  • 可作为字典的键
  • 可作为其他集合的元素

九、总结对比表

操作 方法 示例 说明
创建集合 set() / {} s = {1, 2, 3} 不允许重复
添加元素 add() s.add(4)
删除元素 remove() / discard() s.remove(2)
清空集合 clear() s.clear()
并集 union() / ` ` `a
交集 intersection() / & a & b
差集 difference() / - a - b
对称差集 symmetric_difference() / ^ a ^ b
冻结集合 frozenset() fs = frozenset([1, 2]) 不可变

十、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!