统计列表中连续1-3个H的出现次数(排除更长连续)
更简洁的连续H统计方案
嘿,你提到的这种连续元素统计需求,用Python标准库的itertools.groupby来实现简直完美——完全不用写那种繁琐的“对比当前和前一个元素”的循环,代码简洁还高效!
核心思路
groupby会自动把列表中连续相同的元素归为一组,我们只需要遍历这些分组,筛选出元素为H的组,然后根据组的长度来统计对应次数(只统计长度1、2、3的,超过3的直接忽略)。
代码实现
基础版(直观易懂)
from itertools import groupby target_list = ['C', 'C', 'H', 'H', 'E', 'H', 'C', 'C', 'C', 'H', 'H', 'C', 'H', 'H', 'H', 'H', 'C'] count_1h = count_2h = count_3h = 0 # 遍历所有连续元素组 for char, group in groupby(target_list): if char == 'H': # 计算当前连续H的长度 consecutive_length = len(list(group)) # 根据长度更新对应计数 if consecutive_length == 1: count_1h += 1 elif consecutive_length == 2: count_2h += 1 elif consecutive_length == 3: count_3h += 1 # 长度超过3的直接跳过,不统计 print(f"连续1个H出现: {count_1h}次") print(f"连续2个H出现: {count_2h}次") print(f"连续3个H出现: {count_3h}次")
进阶版(扩展性更强)
如果以后需要调整统计的长度范围,用字典来存计数会更灵活:
from itertools import groupby target_list = ['C', 'C', 'H', 'H', 'E', 'H', 'C', 'C', 'C', 'H', 'H', 'C', 'H', 'H', 'H', 'H', 'C'] # 定义需要统计的长度及初始计数 counts = {1: 0, 2: 0, 3: 0} # 生成所有连续H的长度列表 h_lengths = (len(list(group)) for char, group in groupby(target_list) if char == 'H') # 遍历长度并更新计数 for length in h_lengths: if length in counts: counts[length] += 1 print(f"连续1个H出现: {counts[1]}次") print(f"连续2个H出现: {counts[2]}次") print(f"连续3个H出现: {counts[3]}次")
运行结果
两种代码都会输出和你例子一致的结果:
连续1个H出现: 1次 连续2个H出现: 2次 连续3个H出现: 0次
为什么这个方法更优?
- 代码简洁:省去了手动维护“前一个元素”“当前连续长度”等变量的繁琐逻辑,可读性拉满
- 效率高效:只需要遍历原列表一次,时间复杂度是O(n),和手动循环效率一致,但代码量少很多
- 扩展性好:如果以后要统计其他长度(比如连续4个H),只需要修改计数规则就行,不用大改循环逻辑
内容的提问来源于stack exchange,提问作者Haj Sai
相关产品推荐
相关产品推荐

