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.
相关产品推荐
相关产品推荐

