如何使用列表推导式实现计数器累加 统计列表中子列表的出现次数
子列表出现次数统计的列表推导式实现
你不需要在列表推导式内部维护计数器累加,直接对匹配成功的项做求和即可,同时还要修正你原来写的推导式里的切片错误。
首先给出完整的可运行实现:
def count_sublist_occurrence(sublst, lst): sub_len = len(sublst) # 生成器表达式实现,也可以换成[1 for ...]的列表推导式实现 return sum(1 for i in range(len(lst) - sub_len + 1) if lst[i:i+sub_len] == sublst)
实现说明
- 原写法的切片
lst[i : len(sublst) + 1]存在错误,正确的切片范围应该是从索引i开始,取和子列表等长的片段,即lst[i:i+len(sublst)] - 循环范围优化:只需要遍历到
len(lst) - sub_len + 1即可,超出这个范围的索引取到的切片长度小于子列表,不可能匹配成功,能减少无效遍历 - 计数逻辑:匹配成功时生成1,用
sum()直接对所有生成的1求和,得到的就是匹配总次数,不需要额外声明计数器变量
效果验证
传入示例参数测试:
>>> count_sublist_occurrence([1, 2], [1, 2, 3, 1, 2, 3]) 2
运行结果和原逻辑完全一致。
如果一定要用显式的列表推导式而不是生成器表达式,写法如下:
def count_sublist_occurrence(sublst, lst): sub_len = len(sublst) return sum([1 for i in range(len(lst) - sub_len + 1) if lst[i:i+sub_len] == sublst])
两种写法效果一致,生成器表达式内存占用更低,更推荐使用。
内容的提问来源于stack exchange,提问作者Bryan Hii
相关产品推荐
相关产品推荐

