Python字符串连续重复字符去重问题:itertools存CSV无效求最优解
解决连续重复字符去除及格式转换问题
需求明确
输入字符串:Tem1 = 'Hhelloo ookkee'
期望输出:Tem1 = 'helo oke'
核心要求:
- 去除连续重复的字符(非全局去重,严格保留字符顺序)
- 自动将所有字符转为小写
最优实现方案
方法1:利用itertools.groupby处理完整字符串
groupby是处理连续重复元素的高效工具,配合小写转换即可满足需求:
import itertools def remove_consecutive_duplicates(s): # 先统一转小写,再按连续字符分组去重 lower_s = s.lower() return ''.join(ch for ch, _ in itertools.groupby(lower_s)) # 测试验证 input_str = 'Hhelloo ookkee' output_str = remove_consecutive_duplicates(input_str) print(output_str) # 输出: 'helo oke'
方法2:手动遍历实现(无第三方依赖)
如果不想导入库,手动遍历字符串也能高效完成:
def remove_consecutive_duplicates(s): if not s: return "" lower_s = s.lower() result = [lower_s[0]] for char in lower_s[1:]: if char != result[-1]: result.append(char) return ''.join(result) # 测试验证 input_str = 'Hhelloo ookkee' print(remove_consecutive_duplicates(input_str)) # 输出: 'helo oke'
针对你的代码问题修正
你的代码中,每次仅对单个字符(chr(tem1))调用groupby,这无法处理跨多次写入的连续重复字符(比如连续两次输出'h',单独处理每个'h'不会合并)。正确的做法是先收集所有字符到缓冲区,再统一处理后写入CSV:
import itertools import cv2 # 初始化字符缓冲区,用于收集所有输出字符 char_buffer = [] # 原逻辑中的字符处理部分 tem1 = sum(val*(2**idx) for idx, val in enumerate(reversed(tem))) if bit[0:8]==[1,0,0,1,1,0,0,1]: current_char = chr(tem1) cv2.putText(frame, f"Text Print: {current_char}.....", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) print(current_char) cv2.imshow('frame', frame) if current_char != '0': char_buffer.append(current_char.lower()) # 转小写后加入缓冲区 # 所有字符收集完成后,处理连续重复并写入CSV if char_buffer: full_str = ''.join(char_buffer) cleaned_str = ''.join(ch for ch, _ in itertools.groupby(full_str)) with open('output.csv', 'w') as f: f.write(cleaned_str)
关键说明
- 本方案仅去除连续相邻的重复字符,完全保留原始字符的出现顺序,和全局去重逻辑有本质区别
- 自动处理大小写转换,匹配你给出的输出格式要求
内容的提问来源于stack exchange,提问作者0nespo
相关产品推荐
相关产品推荐

