
从Excel VBA到Python,看集合操作如何化繁为简
前言今天我们就来对比一下Python集合(Set)和VBA在处理去重、交集、并集、差集这四大常见场景时的差异。
说明: 为了更直观地对比代码简洁度,本文VBA示例将省略Dim声明语句,直接使用变量(实际项目建议加上Option Explicit规范代码)。所有变量均使用中文命名,VBA代码尽量减少循环,使用Dictionary的Keys方法直接输出数组。
相信看完这篇文章,你会惊叹:原来数据处理可以这么简单!
图片
一、去重操作:一行代码 vs 字典转换场景:从客户列表中去除重复名单Python实现:
建站客服QQ:88888888{jz:field.toptypename/}# 原始数据客户列表 = ["张三", "李四", "王五", "张三", "赵六", "李四"]# 去重 - 仅需一行!唯一客户 = list(set(客户列表))print(唯一客户) # ['张三', '李四', '王五', '赵六']
VBA实现:
Sub 测试去重() 客户列表 = Array("张三", "李四", "王五", "张三", "赵六", "李四") Set 字典 = CreateObject("Scripting.Dictionary") For i = 0 To UBound(客户列表) 字典(客户列表(i)) = Empty Next 唯一客户 = 字典.Keys ' 直接输出数组 Debug.Print Join(唯一客户, ", ")End Sub对比总结:
· ✅ Python:1行代码搞定 list(set(...))· ⚠️ VBA:需要创建Dictionary对象并循环,共5行核心代码· ⚡ 性能:Python的set底层用哈希表实现,速度极快二、交集操作:找出共同元素场景:找出同时购买A产品和B产品的客户Python实现:
# 两组客户数据A产品客户 = {"张三", "李四", "王五", "赵六"}B产品客户 = {"李四", "王五", "孙七", "周八"}# 求交集 - 一个符号搞定!共同客户 = A产品客户 & B产品客户# 或者使用方法:A产品客户.intersection(B产品客户)print(共同客户) # {'李四', '王五'}VBA实现:
Sub 测试交集() A产品客户 = Array("张三", "李四", "王五", "赵六") B产品客户 = Array("李四", "王五", "孙七", "周八") Set 字典A = CreateObject("Scripting.Dictionary") Set 字典B = CreateObject("Scripting.Dictionary") Set 结果字典 = CreateObject("Scripting.Dictionary") For i = 0 To UBound(A产品客户) 字典A(A产品客户(i)) = Empty Next For i = 0 To UBound(B产品客户) 字典B(B产品客户(i)) = Empty Next For Each 键 In 字典A.Keys If 字典B.Exists(键) Then 结果字典(键) = Empty Next 共同客户 = 结果字典.Keys ' 直接输出数组 Debug.Print Join(共同客户, ", ")End Sub对比总结:
· ✅ Python:用 & 符号或 .intersection() 方法,1行代码· ⚠️ VBA:需要创建3个Dictionary对象,3次循环· 📊 代码量:Python 1行 vs VBA 10+行三、并集操作:合并所有元素场景:合并多个渠道的客户名单(自动去重)Python实现:
# 不同渠道的客户线上客户 = {"张三", "李四", "王五"}线下客户 = {"王五", "赵六", "孙七"}电话客户 = {"李四", "周八"}# 求并集 - 自动去重!全部客户 = 线上客户 | 线下客户 | 电话客户# 或者:线上客户.union(线下客户, 电话客户)print(全部客户) # {'张三', '李四', '王五', '赵六', '孙七', '周八'}VBA实现:
Sub 测试并集() 线上客户 = Array("张三", "李四", "王五") 线下客户 = Array("王五", "赵六", "孙七") 电话客户 = Array("李四", "周八") Set 字典 = CreateObject("Scripting.Dictionary") For i = 0 To UBound(线上客户) 字典(线上客户(i)) = Empty Next For i = 0 To UBound(线下客户) 字典(线下客户(i)) = Empty Next For i = 0 To UBound(电话客户) 字典(电话客户(i)) = Empty Next 全部客户 = 字典.Keys ' 自动去重 Debug.Print Join(全部客户, ", ")End Sub对比总结:
· ✅ Python:用 | 符号实现多集合并集,自动去重· ⚠️ VBA:需要3次循环将所有数组元素加入同一个Dictionary· 🎯 直观性:Python的符号化操作更符合数学思维四、差集操作:找出独有元素场景:找出只购买A产品但未购买B产品的客户Python实现:
# 客户数据A产品客户 = {"张三", "李四", "王五", "赵六"}B产品客户 = {"李四", "王五", "孙七", "周八"}# 求差集(A中有但B中没有)仅A产品客户 = A产品客户 - B产品客户# 或者:A产品客户.difference(B产品客户)print(仅A产品客户) # {'张三', '赵六'}# 对称差集(只在一个集合中出现的元素)独特客户 = A产品客户 ^ B产品客户# 或者:A产品客户.symmetric_difference(B产品客户)print(独特客户) # {'张三', '赵六', '孙七', '周八'}VBA实现:
Sub 测试差集() A产品客户 = Array("张三", "李四", "王五", "赵六") B产品客户 = Array("李四", "王五", "孙七", "周八") Set 字典A = CreateObject("Scripting.Dictionary") Set 字典B = CreateObject("Scripting.Dictionary") Set 结果字典 = CreateObject("Scripting.Dictionary") For i = 0 To UBound(A产品客户) 字典A(A产品客户(i)) = Empty Next For i = 0 To UBound(B产品客户) 字典B(B产品客户(i)) = Empty Next ' 求差集(A中有但B中没有) For Each 键 In 字典A.Keys If Not 字典B.Exists(键) Then 结果字典(键) = Empty Next 仅A产品客户 = 结果字典.Keys Debug.Print "仅购买A产品: " & Join(仅A产品客户, ", ") ' 求对称差集 Set 对称差集字典 = CreateObject("Scripting.Dictionary") For Each 键 In 字典A.Keys If Not 字典B.Exists(键) Then 对称差集字典(键) = Empty Next For Each 键 In 字典B.Keys If Not 字典A.Exists(键) Then 对称差集字典(键) = Empty Next 独特客户 = 对称差集字典.Keys Debug.Print "独特客户: " & Join(独特客户, ", ")End Sub对比总结:
· ✅ Python:差集用 -,对称差集用 ^,各1行代码· ⚠️ VBA:需要遍历判断,对称差集需要两次遍历· 💡 可读性:Python的符号操作一目了然五、实战案例:数据清洗组合技场景:处理多份Excel名单,AG游戏找出重复、遗漏、新增客户Python实现:
# 三份名单旧名单 = {"张三", "李四", "王五", "赵六"}新名单 = {"李四", "王五", "孙七", "周八"}黑名单 = {"王五", "钱九"}# 一行代码完成复杂逻辑!有效新客户 = (新名单 - 旧名单) - 黑名单流失客户 = 旧名单 - 新名单所有有效客户 = (旧名单 | 新名单) - 黑名单print(f"新增客户: {有效新客户}") # {'孙七', '周八'}print(f"流失客户: {流失客户}") # {'张三', '赵六'}print(f"有效客户总数: {len(所有有效客户)}") # 5VBA实现:
Sub 数据清洗案例() 旧名单 = Array("张三", "李四", "王五", "赵六") 新名单 = Array("李四", "王五", "孙七", "周八") 黑名单 = Array("王五", "钱九") Set 字典旧 = CreateObject("Scripting.Dictionary") Set 字典新 = CreateObject("Scripting.Dictionary") Set 字典黑 = CreateObject("Scripting.Dictionary") For i = 0 To UBound(旧名单): 字典旧(旧名单(i)) = Empty: Next For i = 0 To UBound(新名单): 字典新(新名单(i)) = Empty: Next For i = 0 To UBound(黑名单): 字典黑(黑名单(i)) = Empty: Next ' 计算新增客户(新名单 - 旧名单 - 黑名单) Set 字典新增 = CreateObject("Scripting.Dictionary") For Each 键 In 字典新.Keys If Not 字典旧.Exists(键) And Not 字典黑.Exists(键) Then 字典新增(键) = Empty Next ' 计算流失客户(旧名单 - 新名单) Set 字典流失 = CreateObject("Scripting.Dictionary") For Each 键 In 字典旧.Keys If Not 字典新.Exists(键) Then 字典流失(键) = Empty Next ' 计算所有有效客户(旧名单 ∪ 新名单 - 黑名单) Set 字典有效 = CreateObject("Scripting.Dictionary") For Each 键 In 字典旧.Keys If Not 字典黑.Exists(键) Then 字典有效(键) = Empty Next For Each 键 In 字典新.Keys If Not 字典黑.Exists(键) Then 字典有效(键) = Empty Next 有效新客户 = 字典新增.Keys 流失客户 = 字典流失.Keys Debug.Print "新增客户: " & Join(有效新客户, ", ") Debug.Print "流失客户: " & Join(流失客户, ", ") Debug.Print "有效客户总数: " & 字典有效.CountEnd Sub对比总结:
· ✅ Python:3行代码完成复杂的集合运算· ⚠️ VBA:即使省略Dim和压缩代码,仍需20+行· ⏱️ 开发效率:Python开发速度快10倍以上六、性能对比:大数据量测试10万条数据去重测试Python:
import time# 生成10万条数据(含重复)大数据 = list(range(50000)) * 2开始时间 = time.time()唯一数据 = list(set(大数据))结束时间 = time.time()print(f"耗时: {结束时间 - 开始时间:.4f}秒") # 约 0.003秒VBA:
Sub 性能测试() 开始时间 = Timer Set 字典 = CreateObject("Scripting.Dictionary") For i = 1 To 100000 字典(i Mod 50000) = Empty Next 唯一数据 = 字典.Keys Debug.Print "耗时: " & Format(Timer - 开始时间, "0.000") & "秒" ' 约 0.5-1秒(受Excel版本影响)End Sub结论:
· Python在大数据处理上优势明显(快100-300倍)· VBA适合中小规模数据处理· 超过1万条数据建议使用Python七、代码简洁度终极对比让我们用一个表格直观对比四大操作的代码行数:
操作Python核心代码VBA核心代码行数对比去重list(set(列表))创建字典+循环+Keys1 vs 5交集A & B3个字典+3次循环+判断1 vs 10并集A | B | C1个字典+3次循环1 vs 8差集A - B2个字典+2次循环+判断1 vs 9对称差集A ^ B3个字典+4次遍历1 vs 12八、总结:为什么选择Python集合?Python集合的四大优势特性PythonVBA代码简洁度⭐⭐⭐⭐⭐⭐⭐性能效率⭐⭐⭐⭐⭐⭐⭐⭐学习成本⭐⭐⭐⭐⭐⭐⭐可读性⭐⭐⭐⭐⭐⭐⭐⭐快速记忆:Python集合操作符# 数学符号,直观易记去重: set(列表)交集: A & B 或 A.intersection(B)并集: A | B 或 A.union(B)差集: A - B 或 A.difference(B)对称差集:A ^ B 或 A.symmetric_difference(B)适用场景建议
选择Python的情况:
· ✅ 需要频繁进行集合运算· ✅ 处理大规模数据(1万条以上)· ✅ 需要与其他数据分析工具(pandas、numpy)配合· ✅ 追求代码简洁和可维护性· ✅ 需要跨平台运行选择VBA的情况:
· ✅ 仅在Excel内部操作,不需要外部环境· ✅ 数据量较小(几千条以内)· ✅ 团队成员只熟悉VBA· ✅ 需要直接操作Excel对象模型· ✅ 不想安装额外软件九、学习路径建议从VBA到Python的平滑过渡第一步:理解核心概念
· VBA的Dictionary → Python的set/dict· VBA的Array → Python的list· VBA的Collection → Python的list/tuple第二步:掌握集合操作
# 用Python重写你的VBA代码# 从最简单的去重开始旧代码_VBA = "10行代码"新代码_Python = "1行代码"
第三步:进阶应用
· 结合pandas处理Excel· 使用集合优化数据清洗流程· 批量处理多个Excel文件结语从VBA到Python,从复杂到简洁,集合操作的进化体现了编程语言的发展趋势。
一行Python代码,胜过十行VBA代码!
Python的集合操作不仅代码量少,而且更接近数学思维,让数据处理变得优雅而高效。如果你还在为Excel中的数据去重、匹配而烦恼,不妨试试Python的集合操作,你会发现数据处理原来可以如此简单!
记住这个黄金公式:

代码简洁度 = 功能实现 ÷ 代码行数
在集合操作领域,Python的代码简洁度是VBA的10倍!
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报。