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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 06:05:27