Python 3.7+如何将列表转换为连续相同元素的索引分组列表?
解决方案
需求是将列表中连续相同元素的索引按组收集,每组对应一段连续相同元素的索引列表,同时要保证方法能高效处理百万级(10^6)元素的列表。以下是两种高效实现方式:
方法一:使用itertools.groupby(简洁高效)
利用Python标准库的itertools.groupby结合enumerate,通过C实现的内置函数保证处理速度:
from itertools import groupby def F(a): result = [] # 按元素分组,每组是连续相同元素的(索引, 元素)对 for _, group in groupby(enumerate(a), key=lambda x: x[1]): # 提取每组的索引并加入结果 result.append([idx for idx, _ in group]) return result
测试验证:
a = ["a","b","c","c","a","a","a"] print(F(a)) # 输出: [[0], [1], [2, 3], [4, 5, 6]]
该方法时间复杂度为O(n),每个元素仅遍历一次,内存占用可控,适合处理百万级数据。
方法二:手动遍历(无依赖,性能优异)
纯Python循环实现,避免模块导入,在某些场景下性能略优于groupby:
def F(a): if not a: return [] result = [] current_val = a[0] current_indices = [0] # 从第二个元素开始遍历 for idx in range(1, len(a)): if a[idx] == current_val: current_indices.append(idx) else: # 当前组结束,加入结果并初始化新组 result.append(current_indices) current_val = a[idx] current_indices = [idx] # 加入最后一组数据 result.append(current_indices) return result
同样测试验证后输出符合预期,该方法同样是O(n)时间复杂度,内存仅维护当前组的索引列表,处理百万级元素时内存压力极小。
选择建议
- 追求代码简洁性,优先选方法一;
- 追求极致性能或避免模块依赖,选方法二。
内容的提问来源于stack exchange,提问作者user19941595
相关产品推荐
相关产品推荐

