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

Python获取列表中重复元素索引的问题

问题排查:获取列表重复元素的所有索引

原需求:给定列表 [1, 2, 3, 6, 1, 3],需要获取所有重复元素的索引,预期返回元素1的索引0、4,元素3的索引2、5,但运行以下代码后仅输出[4],无法捕获首次出现的索引。

原代码:

lst = [1, 2, 3, 6, 1, 3]

oc_set = set()
res = []
for idx, val in enumerate(lst):
    if val not in oc_set:
        oc_set.add(val)         
    else:
        res.append(idx)     

print(res)

输出结果:[4]

问题原因

现有代码用集合oc_set记录已出现的元素,仅在元素第二次及之后出现时,将当前索引加入结果列表。首次出现的索引被直接跳过,完全没有被记录,因此无法获取到元素1的索引0、元素3的索引2。

修正方案

方案1:记录所有元素的索引,再筛选重复项

通过字典记录每个元素对应的所有索引,最后提取索引数量大于1的元素的所有索引:

lst = [1, 2, 3, 6, 1, 3]
from collections import defaultdict

# 构建元素到索引列表的映射
index_map = defaultdict(list)
for idx, val in enumerate(lst):
    index_map[val].append(idx)

# 收集所有重复元素的索引
res = []
for indices in index_map.values():
    if len(indices) > 1:
        res.extend(indices)

print(res)  # 输出 [0, 4, 2, 5]

方案2:遍历过程中记录首次索引,遇到重复时补充首次索引

用字典存储元素的首次索引,后续遇到重复元素时,先检查首次索引是否已在结果中,未加入则补充,再加入当前索引:

lst = [1, 2, 3, 6, 1, 3]

oc_dict = {}
res = []
for idx, val in enumerate(lst):
    if val not in oc_dict:
        oc_dict[val] = idx
    else:
        # 确保首次索引只被添加一次
        if oc_dict[val] not in res:
            res.append(oc_dict[val])
        res.append(idx)

print(res)  # 输出 [0, 4, 2, 5]

如果需要索引按原列表的先后顺序排列,可在最后执行res.sort(),得到排序后的结果[0, 2, 4, 5]。

内容的提问来源于stack exchange,提问作者Alex S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 22:12:24