Python-什么是集合

204 阅读4分钟

一、前言

在 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])不可变

十、结语

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