如何统计列表中连续相邻出现的子列表次数?
统计子列表连续相邻出现的次数
我完全理解你的需求:你要统计目标子列表list_sequence在原列表my_list中连续相邻出现的最大次数——简单来说,就是子列表连续重复出现时,统计这个连续序列的长度;如果子列表分散在列表各处(中间夹着其他元素),就只算单次出现的次数。比如你提到的场景:
- 初始列表里仅出现1次
list_sequence,结果为1 - 在列表开头和末尾各追加
list_sequence(三个分散的子列表),结果仍为1 - 在原
list_sequence的末尾紧接着再添加一个list_sequence(两个连续的子列表),结果为2
下面是实现这个功能的Python代码方案:
步骤1:找出所有子列表的起始索引
首先我们需要一个辅助函数,遍历原列表,定位所有list_sequence出现的起始位置:
def find_all_sublist_indices(my_list, sublist): sub_len = len(sublist) list_len = len(my_list) indices = [] # 遍历所有可能的起始位置,匹配子列表 for i in range(list_len - sub_len + 1): if my_list[i:i+sub_len] == sublist: indices.append(i) return indices
步骤2:统计连续相邻的最大次数
基于找到的索引,我们可以检查哪些索引是连续的(即后一个子列表的起始位置等于前一个子列表的起始位置加上子列表长度),从而统计最长的连续序列长度:
def count_consecutive_sublist(my_list, sublist): sub_len = len(sublist) # 处理空列表或子列表比原列表长的边界情况 if sub_len == 0 or len(my_list) < sub_len: return 0 indices = find_all_sublist_indices(my_list, sublist) if not indices: return 0 max_count = 1 current_count = 1 # 遍历索引列表,检查连续性 for i in range(1, len(indices)): if indices[i] == indices[i-1] + sub_len: current_count += 1 if current_count > max_count: max_count = current_count else: # 遇到不连续的子列表,重置当前计数 current_count = 1 return max_count
测试你的场景
用你描述的例子来验证代码效果:
# 初始示例:my_list中仅包含1次list_sequence list_sequence = ["Example15", "Example16"] my_list = ["Item1", "Item2"] + list_sequence + ["Item3", "Item4"] print(count_consecutive_sublist(my_list, list_sequence)) # 输出:1 # 开头和末尾追加list_sequence,子列表分散 my_list = list_sequence + my_list + list_sequence print(count_consecutive_sublist(my_list, list_sequence)) # 输出:1 # 在原list_sequence后添加一个连续的list_sequence my_list = ["Item1", "Item2"] + list_sequence + list_sequence + ["Item3", "Item4"] print(count_consecutive_sublist(my_list, list_sequence)) # 输出:2
如果你需要的是所有连续相邻的次数总和(比如两个连续算1次相邻,三个连续算2次相邻),只需要修改统计逻辑:把max_count换成total_consecutive,每次检测到连续时total_consecutive +=1即可,可根据实际需求调整。
内容的提问来源于stack exchange,提问作者Fragkiller
相关产品推荐
相关产品推荐

