Python实现查找列表中恰好出现两次元素的全量对应索引
原代码的核心问题
- 使用
list(occurrances.values()).index(2)查找的逻辑存在天然局限性:index()方法只会匹配列表中第一个值为2的位置,后续所有出现次数为2的元素都会被遗漏,根本无法覆盖全量匹配项 - 现有逻辑仅收集了符合条件的元素值本身,完全没有关联这些元素在原列表中的索引,和最初「返回对应全部索引」的需求不匹配
可行的实现方案
整体逻辑拆成两步,兼顾正确性与简洁性:
- 借助Counter的统计结果,一次性筛出所有出现次数恰好等于2的元素,存为集合实现O(1)快速查询
- 用
enumerate遍历原始列表,匹配到目标元素时同步收集对应的索引位置
如果需要直接输出所有目标元素对应的索引集合,运行以下代码即可:
from collections import Counter length = int(input()) user_input = [int(x) for x in input().split()] # 筛选仅出现两次的元素作为目标集合 target_vals = {val for val, cnt in Counter(user_input).items() if cnt == 2} # 枚举原列表收集对应索引 result = [idx for idx, val in enumerate(user_input) if val in target_vals] print(result)
如果需要按元素分组存储每个值对应的索引,方便后续区分不同重复项的位置,可以调整为字典结构存储结果:
from collections import Counter, defaultdict length = int(input()) user_input = [int(x) for x in input().split()] val_count = Counter(user_input) target_vals = {val for val, cnt in val_count.items() if cnt == 2} index_res = defaultdict(list) for idx, val in enumerate(user_input): if val in target_vals: index_res[val].append(idx) print(dict(index_res))
补充说明:Counter本身是可迭代的键值对结构,不需要硬转成普通列表再通过
index()匹配值,这种写法不仅会漏匹配多个符合条件的元素,也会增加不必要的列表转换开销。
内容的提问来源于stack exchange,提问作者Liana
相关产品推荐
相关产品推荐

