本文目录导读:

我来详细介绍Python集合的创建和使用方法,通过实际案例让你快速掌握。
集合的创建
# 方法1:使用花括号
fruits = {'apple', 'banana', 'orange', 'apple'} # 重复元素会被自动去重
print(fruits) # {'orange', 'banana', 'apple'}
# 方法2:使用set()函数
numbers = set([1, 2, 3, 4, 5, 3, 2]) # 列表转集合
print(numbers) # {1, 2, 3, 4, 5}
# 创建空集合
empty_set = set() # 注意:{} 创建的是空字典
print(type(empty_set)) # <class 'set'>
基本操作案例
添加和删除元素
# 创建一个集合
students = {'张三', '李四', '王五'}
# 添加元素
students.add('赵六')
print(students) # {'张三', '李四', '王五', '赵六'}
# 批量添加
students.update(['小明', '小红'])
print(students) # {'小明', '小红', '张三', '李四', '王五', '赵六'}
# 删除元素
students.remove('张三') # 元素不存在会报错
students.discard('不存在的人') # 元素不存在不会报错
popped = students.pop() # 随机删除并返回一个元素
print(f"被删除的元素: {popped}")
集合运算
# 数学和编程的共同爱好
math_lovers = {'小明', '小红', '张三', '李四'}
program_lovers = {'小明', '王五', '赵六', '张三'}
# 交集 - 既喜欢数学又喜欢编程的人
both = math_lovers & program_lovers
print(f"交集: {both}") # {'小明', '张三'}
# 并集 - 所有学生
all_students = math_lovers | program_lovers
print(f"并集: {all_students}")
# 差集 - 只喜欢数学,不喜欢编程的人
only_math = math_lovers - program_lovers
print(f"只喜欢数学: {only_math}") # {'小红', '李四'}
# 对称差集 - 只喜欢其中一门的人
only_one = math_lovers ^ program_lovers
print(f"只喜欢一门: {only_one}") # {'王五', '赵六', '小红', '李四'}
实用案例
案例1:数据去重
# 从列表中去除重复元素
data = [1, 2, 3, 2, 1, 4, 5, 3, 6, 4]
unique_data = list(set(data))
print(f"去重后: {unique_data}") # [1, 2, 3, 4, 5, 6]
# 统计文章中不同单词的数量
text = "hello world hello python world python programming"
words = text.split()
unique_words = set(words)
print(f"不同单词数量: {len(unique_words)}") # 4
print(f"不同单词: {unique_words}")
案例2:会员系统
# 会员管理
vip_users = {'张三', '李四', '王五'}
blacklist = {'王五', '赵六'}
# 检查用户状态
def check_user(username):
if username in blacklist:
return f"{username} 在黑名单中"
elif username in vip_users:
return f"{username} 是VIP会员"
else:
return f"{username} 是普通用户"
# 测试
print(check_user('张三')) # 张三 是VIP会员
print(check_user('王五')) # 王五 在黑名单中
# 新会员注册
new_users = {'赵六', '小明', '小红'}
vip_users = vip_users | (new_users - blacklist) # 排除黑名单用户
print(f"更新后的VIP用户: {vip_users}")
案例3:权限管理
# 用户权限管理
class PermissionManager:
def __init__(self):
self.admin_roles = {'admin', 'super_admin'}
self.user_permissions = {}
def add_user_permission(self, user, *permissions):
if user not in self.user_permissions:
self.user_permissions[user] = set()
self.user_permissions[user].update(permissions)
def check_permission(self, user, required_permission):
if user not in self.user_permissions:
return False
# 管理员拥有所有权限
if 'admin' in self.user_permissions[user]:
return True
return required_permission in self.user_permissions[user]
def common_permissions(self, *users):
"""获取多个用户的共同权限"""
if not users:
return set()
permissions_sets = []
for user in users:
if user in self.user_permissions:
permissions_sets.append(self.user_permissions[user])
if not permissions_sets:
return set()
# 所有用户都拥有的权限(交集)
return set.intersection(*permissions_sets)
# 使用示例
pm = PermissionManager()
pm.add_user_permission('张三', 'read', 'write', 'execute')
pm.add_user_permission('李四', 'read', 'write')
pm.add_user_permission('王五', 'admin')
print(pm.check_permission('张三', 'execute')) # True
print(pm.check_permission('李四', 'execute')) # False
print(pm.check_permission('王五', 'delete')) # True (管理员)
print(f"共同权限: {pm.common_permissions('张三', '李四')}") # {'read', 'write'}
常用方法速查
s = {1, 2, 3, 4, 5}
# 常用方法
s.add(6) # 添加元素
s.remove(3) # 删除元素(不存在会抛异常)
s.discard(10) # 安全删除(不存在不抛异常)
s.pop() # 随机删除并返回
s.clear() # 清空集合
s.copy() # 复制集合
# 判断
len(s) # 集合大小
3 in s # 成员检查(快速)
# 集合运算返回新集合
s1 & s2 # 交集
s1 | s2 # 并集
s1 - s2 # 差集
s1 ^ s2 # 对称差集
# 集合关系判断
s1.issubset(s2) # s1是否是s2的子集
s1.issuperset(s2) # s1是否是s2的超集
s1.isdisjoint(s2) # s1和s2是否没有交集
# 修改当前集合
s1.intersection_update(s2) # 修改s1为s1∩s2
s1.difference_update(s2) # 修改s1为s1-s2
s1.symmetric_difference_update(s2) # 修改s1为s1^s2
注意事项
# 1. 集合中的元素必须是不可变类型
# 正确
valid_set = {1, 'hello', (1, 2, 3)}
# 错误
# invalid_set = {[1, 2, 3]} # 列表不能作为集合元素
# 2. 集合运算性能优势
import time
# 使用列表查找
list_data = list(range(1000000))
start = time.time()
999999 in list_data # 耗时较慢
print(f"列表查找耗时: {time.time() - start}")
# 使用集合查找
set_data = set(range(1000000))
start = time.time()
999999 in set_data # 速度快得多
print(f"集合查找耗时: {time.time() - start}")
# 3. 集合推导式
squares = {x**2 for x in range(10)}
print(squares) # {0, 1, 4, 9, 16, 25, 36, 49, 64, 81}
集合最常用的场景是:去重、快速成员检查、集合运算,在实际开发中,根据需求选择合适的数据结构能显著提升代码效率。