You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计列表中有序连续与非连续目标序列的出现次数?

问题:统计非连续有序序列的出现次数

给定两个列表:

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次匹配:[1,2,3,4,5,2,1,2,2,1,2,3,4,5,1,3,2,3,1]
  2. 第2次匹配:[1,2,3,4,5,2,1,2,2,1,2,3,4,5,1,3,2,3,1]
  3. 第3次匹配:[1,2,3,4,5,2,1,2,2,1,2,3,4,5,1,3,2,3,1]
  4. 第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

代码说明

  1. 初始化计数器count和当前匹配进度current_pos(对应lookup_list的索引,从0开始)
  2. 遍历my_list的每个元素:
    • 若当前元素与lookup_list[current_pos]匹配,则推进进度
    • 当进度走完整个lookup_list时,说明完成一次有效匹配,计数器加1并重置进度,继续寻找下一次匹配
  3. 支持任意长度的lookup_list,例如测试lookup_list=[1,2]:
    lookup_list = [1,2]
    print(count_non_consecutive_sequence(my_list, lookup_list))  # 输出:6
    

内容的提问来源于stack exchange,提问作者mrgn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 09:35:24