当前位置: 首页 > article >正文

Python高效处理字符串去重的5种实用技巧

1. 字符串去重的核心逻辑与应用场景字符串去重是数据处理中最基础却高频的操作之一。想象你手里有一串钥匙其中几把是重复的去重就是帮你挑出唯一的那几把。在Python中处理用户输入、日志清洗或数据预处理时我经常遇到需要去除重复字符的情况。比如最近处理中文地址数据时北京市北京市朝阳区这样的字符串就需要去掉重复的北京市。去重的本质是保留唯一性元素但不同方法在顺序保留和执行效率上有显著差异。新手常犯的错误是只关注去重结果却忽略了原始顺序是否重要。比如处理时间序列数据时顺序错乱会导致逻辑错误。我曾在一个电商项目中因为错误使用set()去重用户行为日志导致后续分析完全错位这个坑让我记忆犹新。2. 基础遍历法最直观的去重手段2.1 正向遍历法这是最符合人类思维的方式——逐个检查字符是否已存在新字符串中。就像整理衣柜时把每件衣服拿出来看看是否已经挂在了新衣柜里name 王李张李陈王杨张吴周王刘赵黄吴杨 unique_name for char in name: if char not in unique_name: # 检查字符是否已存在 unique_name char print(unique_name) # 输出王李张陈杨吴周刘赵黄优点原始顺序完全保留代码可读性极佳。缺点每次都要检查整个新字符串当处理10万字符时速度会明显下降。实测在百万级数据下这种方法比最优方案慢50倍以上。2.2 反向遍历法有些场景需要保留最后出现的字符这时候可以倒着处理name 王李张李陈王杨张吴周王刘赵黄吴杨 unique_name i len(name) - 1 while i 0: if name[i] not in unique_name: unique_name name[i] unique_name # 注意拼接顺序 i - 1 print(unique_name) # 输出杨吴黄赵刘王周张陈李这个方法在分析日志时特别有用比如需要获取每个用户最近的操作记录。但要注意字符串拼接方式错误的unique_name name[i]会导致结果仍然是正序。3. 集合转换法牺牲顺序换极致性能3.1 基础集合去重Python的set()天生就是为去重设计的就像魔法一样瞬间完成去重name 王李张李陈王杨张吴周王刘赵黄吴杨 unique_chars set(name) print(.join(unique_chars)) # 输出随机顺序的字符惊人性能在我的测试中处理百万字符仅需0.1秒比遍历法快两个数量级。致命缺点完全丢失原始顺序输出结果每次运行可能不同。3.2 保留顺序的集合改进版结合列表推导和集合的特性可以鱼与熊掌兼得name 王李张李陈王杨张吴周王刘赵黄吴杨 seen set() unique_name .join([char for char in name if not (char in seen or seen.add(char))]) print(unique_name) # 输出王李张陈杨吴周刘赵黄这个技巧利用了列表推导式的短路特性和set.add()方法返回None的特性。虽然有点绕但实测保留顺序的同时速度仍是纯遍历法的10倍。我在处理大型CSV文件时这个方法帮了大忙。4. 字典键去重法兼顾顺序与性能4.1 基础字典法Python字典的键具有天然去重特性而且从3.7版开始保留插入顺序name 王李张李陈王杨张吴周王刘赵黄吴杨 unique_name .join({}.fromkeys(name)) print(unique_name) # 输出王李张陈杨吴周刘赵黄原理fromkeys()创建新字典时重复键会被自动覆盖。这个方法在可读性和性能间取得了完美平衡是我现在最常用的方案。4.2 高级字典推导式对于复杂对象可以用字典推导式实现条件去重data abAcBdefA unique_data .join({ord(char.lower()): char for char in data}.values()) print(unique_data) # 输出abAcef (大小写敏感去重)这个技巧在处理需要保留特定特征的场景非常有用比如我在处理商品SKU时需要保留最后出现的大写格式。5. 切片检测法特殊场景的解决方案5.1 子串切片检测这种方法通过不断缩小检测范围来实现去重name 王李张李陈王杨张吴周王刘赵黄吴杨 length len(name) for _ in range(length): if name[0] in name[1:length]: name name[1:length] else: name name[1:length] name[0] print(name) # 输出李陈张周王刘赵黄吴杨适用场景需要保留特定位置字符时。比如我只想保留每个重复字符的最后一次出现位置。但要注意这个方法的时间复杂度是O(n²)大数据量时慎用。5.2 正则表达式法虽然正则不是最高效的方案但在复杂模式匹配时无可替代import re name 王李张李陈王杨张吴周王刘赵黄吴杨 # 匹配后面出现过的字符并替换为空 unique_name re.sub(r(.)(?.*\1), , name) print(unique_name) # 输出李陈王杨张吴周刘赵黄这个方法在清洗含特定模式的文本时特别有效比如去除重复的HTML标签。但正则表达式需要较深的理解建议先在regex101.com这样的平台测试你的模式。6. 性能对比与实战选型通过实际测试对比各种方法测试环境Python 3.101MB随机中文字符串方法耗时(ms)内存占用(MB)顺序保持基础遍历法12502.1是集合转换法185.3否有序集合法954.8是字典键法223.7是正则表达式法3206.2否选型建议小数据量(1KB)用最易读的方法如基础遍历法大数据量且需保序字典键法是最佳选择极大数据量(10MB)考虑分块处理字典键法组合复杂模式匹配正则表达式配合集合去重在最近的一个用户行为分析项目中我最终选择了有序集合法因为在处理千万级日志时它比纯字典法节省了30%内存而速度只下降15%。具体选择还是要根据你的数据特征和业务需求来决定。

相关文章:

Python高效处理字符串去重的5种实用技巧

1. 字符串去重的核心逻辑与应用场景 字符串去重是数据处理中最基础却高频的操作之一。想象你手里有一串钥匙,其中几把是重复的,去重就是帮你挑出唯一的那几把。在Python中处理用户输入、日志清洗或数据预处理时,我经常遇到需要去除重复字符的…...

高效制作IO通道测试表:从位号表到VLOOKUP函数实战

1. 为什么需要IO通道测试表? 在工业自动化项目中,IO通道测试表是FAT(工厂验收测试)环节的必备工具。想象一下你正在调试一个化工厂的DCS系统,面对成百上千个温度、压力、流量信号,如果没有一个清晰的测试清…...

作品被篡改署名?三步维权指南

您好,我理解您遇到了作品被他人擅自修改并署名为“悟空”的情况,这确实是一件令人非常气愤和不快的事情。首先,请务必保持冷静。愤怒是正常的,但清晰的行动才能更好地维护您的权益。针对这种情况,您可以按照以下步骤来…...

一篇顶一万篇,很难找到代码这么全的高分文章,WGS、RNA-seq、scRNA-seq、免疫肽组质谱联合分析

🚀科研不掉发,快来这个地表最强的生信神仙网站:中国银河生信云平台👉 立即访问:https://usegalaxy.cn结直肠癌免疫治疗中,多数新抗原筛选仅聚焦编码区,大量潜在靶点被忽略,非编码区能…...

Java程序设计(第3版)第二章——变量的三种定义方式2和3

变量的第二种使用方式 在声明的同时并赋值 数据类型 变量名 = 数据; int b = 12; System.out.println(b); 输出为12变量的第三种使用方式 同时定义多个同类型变量 int c,d=1,e=11,f=23,g=32,h=0…...

科研不秃头!谁还不知道这个零代码生信神器

各位深陷生信泥潭的科研宝子们,集合啦!📢你是否也经历过这样的绝望:❌ 导师甩来一组单细胞数据,你却连 Linux 怎么登录都不知道?❌ 好不容易装好了 R 语言,结果包版本冲突报错到怀疑人生&#x…...

SQL分组Group By

一、先搞懂:分组查询是干嘛的?分组查询 GROUP BY 就是把表中数据按照某个字段「分类」,然后对每一类做统计。比如你 emp 表有 gender(性别)字段,用分组就能:统计「男员工有多少人、女员工有多少…...

YOLOv11桌面应用实战:PyQt5打造智能监控与目标追踪系统

1. YOLOv11与PyQt5的强强联合 在计算机视觉领域,YOLO系列模型一直以其实时性和准确性著称。最新发布的YOLOv11在保持原有优势的基础上,进一步优化了模型结构和训练策略,使其在小目标检测和复杂场景下的表现更加出色。而PyQt5作为Python生态中…...

基于Matlab APP Designer的GNSS数据质量分析工具开发实践

1. 为什么选择Matlab APP Designer开发GNSS分析工具 第一次接触GNSS数据质量分析时,我和大多数初学者一样,面对密密麻麻的RINEX文件头大如斗。当时实验室的师兄随手甩给我一个Matlab脚本,说"自己改改就能用"。结果光是理解那些没有…...

线性代数实战:特征值与二次型的核心应用解析

1. 特征值与特征向量的实战密码 第一次接触特征值和特征向量时,我也觉得这不过是数学课本里的抽象概念。直到在图像压缩项目中亲眼看到,用前20%的特征向量就能还原90%的图像信息,才真正理解它的威力。特征值分解就像给矩阵做X光,能…...

Simulink仿真避坑指南:三相异步电机调压调速,你的转速波形为什么震荡不稳?

Simulink三相异步电机调压调速实战:从波形异常到稳定输出的深度调优 当你在Simulink中搭建完三相异步电机调压调速模型,满心期待地点击"运行"按钮,却发现转速波形像过山车一样上下震荡——这种挫败感我深有体会。作为一名经历过无数…...

石大胜华冲刺港股:年营收68亿 亏588万 郭天明控制22%股权

雷递网 雷建平 4月5日石大胜华新材料集团股份有限公司(简称:“石大胜华”)日前递交招股书,准备在港交所上市。石大胜华已在A股上市,截至周五收盘,石大胜华股价为80.75元,市值为188亿元。一旦在港…...

台达 PLC ES 与 3 台欧姆龙 E5CC 温控器通讯程序分享

台达PLC ES与3台欧姆龙E5CC温控器通讯程序 程序带注释,并附送昆仑通态和威纶通触摸屏有接线方式,设置 程序温度可靠 器件:台达DVP ES系列的PLC,3台欧姆龙E5CC系列温控器,昆仑通态,威纶通触摸屏 功能&#x…...

吴恩达机器学习第一天

#P2 机器学习的定义定义为赋予计算机在没有明确编程的情况下学习能力的研究领域。给学习算法更多的学习机会,他的表现就会更好。主要类型:监督学习(supervised learning)无监督学习(unsupervised learning)推荐系统(re…...

Go 网络编程超时控制方案

Go网络编程中的超时控制方案 在分布式系统和微服务架构盛行的今天,网络通信的稳定性成为关键。Go语言凭借其高效的并发模型和简洁的语法,成为网络编程的热门选择。网络环境复杂多变,超时控制是确保系统健壮性的重要手段。本文将介绍Go网络编…...

应急响应靶机练习-Web2

一、靶机介绍这个靶机主要是通过暴力破解ftp,获取ftp账号后上传了php shell,获取shell后创建后门用户,以及做了一些端口转发操作。靶机采用phpstudy,开启了ftp和web服务,但是要注意的是,一旦ftp开启&#x…...

你的ESP32项目还缺个BGM?手把手教你做个可切换歌单的迷你音乐播放器

为ESP32项目打造智能音乐模块:从蜂鸣器驱动到歌单管理系统 当你的智能家居设备在清晨用一段舒缓旋律唤醒你,或是机器人完成指令时播放一段俏皮的提示音,这种交互体验会瞬间提升产品的温度。ESP32作为一款功能强大的物联网芯片,完全…...

STM8S001单片机:8引脚高性价比嵌入式开发方案

1. STM8S001单片机:小身材大能量的性价比之王 在嵌入式开发领域,我们常常陷入一个两难选择:要么使用功能强大但引脚众多、价格昂贵的高端MCU,要么选择功能简陋、开发环境不友好的廉价芯片。STMicroelectronics最新推出的STM8S001系…...

MySQL后端开发核心知识点

一、存储引擎(只重点 InnoDB)MySQL 5.5 以后默认引擎是 InnoDB,也是现代企业项目唯一使用的引擎。InnoDB 特点:支持 事务支持 行级锁,并发性能好支持 外键(实际开发基本不用)基于 B 树索引结构依…...

AI绘画联动:OpenClaw调用Qwen3-32B生成Stable Diffusion提示词

AI绘画联动:OpenClaw调用Qwen3-32B生成Stable Diffusion提示词 1. 当AI助手遇上AI绘画:我的自动化创作实验 去年第一次接触Stable Diffusion时,我就被它的创作潜力震撼了。但很快发现一个问题:要得到理想的画面,往往…...

从CH341A编程器、SPI Flash到Linux+STM32理解

前言最近在折腾路由器刷机时入手了一款CH341A编程器,本以为它只能刷刷BIOS芯片,深入研究后发现这简直是“宝藏工具”。更有意思的是,在弄明白了存储芯片的底层操作后,我对嵌入式系统中Linux和STM32的协作关系有了全新的理解。本文…...

Fujitsu空调本地化控制:ESP32协议逆向与硬件隔离方案

1. FujitsuAC 开源库深度解析:面向嵌入式工程师的 Fujitsu 空调本地化控制方案1.1 项目定位与工程价值FujitsuAC 是一个专为 ESP32 平台设计的开源固件库,其核心目标是完全替代 Fujitsu 原厂 UTY-TFSXW1 / UTY-TFSXF3 WiFi 通信模块,实现对 F…...

在FreeRTOS上为Zynq CAN驱动添加任务间通信:一个实用的数据收发框架搭建

在FreeRTOS上为Zynq CAN驱动构建高效任务间通信框架 当我们在Zynq平台上开发基于FreeRTOS的CAN总线应用时,如何安全高效地在中断服务程序(ISR)与任务之间传递数据,是构建稳定系统的关键挑战。本文将深入探讨一个经过实战检验的解决方案——通过消息队列和…...

嵌入式开发者必看:GitHub高星项目实战解析

1. 嵌入式开发者不可错过的GitHub高星项目盘点作为一名在嵌入式领域摸爬滚打多年的开发者,我深知优质开源项目对技术成长的重要性。GitHub这个宝藏平台上其实藏着不少嵌入式相关的精品项目,今天我就带大家深度剖析几个值得研究的项目,并分享我…...

15K Star 爆火!用大厂 PUA 话术逼 AI 干活,Claude 效率翻倍的黑色幽默工具

用大厂 PUA 话术逼 AI 干活:一个 15K Star 的黑色幽默项目如何让 Claude 效率翻倍 最近 GitHub 上火了个名字叫"PUA"的开源项目,短短几周从 0 到 15K Stars,还被各大科技媒体争相报道。 看名字的时候我以为又是哪位网友的整活之作…...

新手入门无人机飞控,别再傻傻分不清PIXHAWK、PX4和APM了

无人机飞控入门指南:PIXHAWK硬件与PX4/APM固件全解析 刚接触无人机DIY的新手,面对琳琅满目的飞控硬件和固件选择时,往往会陷入"PIXHAWK、PX4、APM到底有什么区别"的困惑。这就像第一次组装电脑时分不清CPU和操作系统的关系——硬件…...

【计算机视觉】Intel RealSense深度相机与OpenCV融合:从基础配置到实时交互应用

1. 深度相机与OpenCV的黄金组合 第一次接触Intel RealSense深度相机时,我被它同时获取RGB和深度数据的能力惊艳到了。这就像给普通摄像头装上了"立体视觉",不仅能看见物体的颜色和形状,还能精确感知物体离相机有多远。而OpenCV作为…...

Activiti7实战指南:从流程实例到任务分配的全流程解析

1. Activiti7流程引擎核心概念解析 Activiti7作为当前最流行的开源工作流引擎之一,在企业级业务流程管理中扮演着重要角色。我第一次接触Activiti是在2014年参与某金融项目的审批系统开发时,当时就被它优雅的设计理念所吸引。经过多年实战,我…...

CubeIDE用户看过来:当你的STM32板载CMSIS-DAP不被支持时,3种实用的替代烧录方案

CubeIDE用户实战指南:当CMSIS-DAP不被支持时的3种高效烧录方案 作为一名长期使用STM32CubeIDE的开发者,你一定遇到过这样的尴尬场景——手头的开发板明明集成了CMSIS-DAP仿真器,却因为CubeIDE的兼容性问题无法直接使用。这种"看得见却用…...

BIOS更新全攻略:从版本检查到安全升级的实用指南

1. BIOS更新前的必要准备 每次打开电脑时,那个一闪而过的黑底白字界面就是BIOS(基本输入输出系统),它就像是电脑硬件的"总指挥"。我见过太多人因为盲目刷BIOS导致主板报废的案例,所以更新前一定要做好这些准…...