如何统计列表中有序连续与非连续目标序列的出现次数?
问题:统计非连续有序序列的出现次数
给定两个列表:
lookup_list = [1,2,3] my_list = [1,2,3,4,5,2,1,2,2,1,2,3,4,5,1,3,2,3,1]
需要统计lookup_list在my_list中的出现次数,需满足以下规则:
- 元素顺序必须严格遵循
lookup_list的顺序(例如1→2→3) - 元素无需连续相邻:比如序列
[1,4,2,1,5,3]会被判定为匹配,因为存在1之后的2,以及2之后的3
匹配示例(加粗部分为每次匹配的对应元素):
- 第1次匹配:[1,2,3,4,5,2,1,2,2,1,2,3,4,5,1,3,2,3,1]
- 第2次匹配:[1,2,3,4,5,2,1,2,2,1,2,3,4,5,1,3,2,3,1]
- 第3次匹配:[1,2,3,4,5,2,1,2,2,1,2,3,4,5,1,3,2,3,1]
- 第4次匹配:[1,2,3,4,5,2,1,2,2,1,2,3,4,5,1,3,2,3,1]
lookup_list支持动态变化,例如可以是[1,2]或[1,2,3,4]等。目前仅能实现连续相邻序列的统计,比如使用ngrams的代码:
from nltk import ngrams from collections import Counter lookup_list = [1,2,3] my_list = [1,2,3,4,5,2,1,2,2,1,2,3,4,5,1,3,2,3,1] all_counts = Counter(ngrams(my_list, len(lookup_list))) counts = {k: all_counts[k] for k in [tuple(lookup_list)]} counts >>> {(1, 2, 3): 2}
尝试过pandas滚动窗口函数,但无自定义重置选项,无法满足需求。
解决方案
可以通过追踪lookup_list的匹配进度来实现非连续有序序列的统计,具体代码如下:
def count_non_consecutive_sequence(my_list, lookup_list): count = 0 current_pos = 0 lookup_length = len(lookup_list) if lookup_length == 0: return 0 for item in my_list: if item == lookup_list[current_pos]: current_pos += 1 # 完成一次完整匹配,计数并重置进度 if current_pos == lookup_length: count += 1 current_pos = 0 return count # 测试示例 lookup_list = [1,2,3] my_list = [1,2,3,4,5,2,1,2,2,1,2,3,4,5,1,3,2,3,1] print(count_non_consecutive_sequence(my_list, lookup_list)) # 输出:4
代码说明
- 初始化计数器
count和当前匹配进度current_pos(对应lookup_list的索引,从0开始) - 遍历
my_list的每个元素:- 若当前元素与
lookup_list[current_pos]匹配,则推进进度 - 当进度走完整个
lookup_list时,说明完成一次有效匹配,计数器加1并重置进度,继续寻找下一次匹配
- 若当前元素与
- 支持任意长度的
lookup_list,例如测试lookup_list=[1,2]:lookup_list = [1,2] print(count_non_consecutive_sequence(my_list, lookup_list)) # 输出:6
内容的提问来源于stack exchange,提问作者mrgn
相关产品推荐
相关产品推荐

