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

如何获取列表中匹配元素的索引?是否有内置函数实现?

重复元素索引列表的实现方案

问题描述

我有一个列表,例如['a', 'b', 'c', 'a', 'a', 'b'],希望输出其中重复元素的索引列表,针对该示例,输出应为[[0, 3, 4], [1, 5]]。由于列表规模较小,无需考虑性能或内存占用问题,请问在Python列表、NumPy或Pandas中是否已有可实现该功能的内置函数?

Python原生列表、NumPy、Pandas都没有直接实现该需求的内置函数,但可以通过组合现有工具快速实现,以下是三种场景的具体方案:

原生Python实现

用字典配合enumerate遍历列表,记录每个元素的索引,最后筛选出重复元素的索引列表:

lst = ['a', 'b', 'c', 'a', 'a', 'b']
index_map = {}
for idx, val in enumerate(lst):
    index_map.setdefault(val, []).append(idx)
# 过滤仅出现一次的元素,保留原列表中元素首次出现的顺序
result = [indices for val, indices in index_map.items() if len(indices) > 1]
print(result)  # 输出 [[0, 3, 4], [1, 5]]

这里setdefault方法可以简化字典的初始化操作,避免重复判断键是否存在。

NumPy实现

结合np.unique和np.where来定位重复元素的索引:

import numpy as np

arr = np.array(['a', 'b', 'c', 'a', 'a', 'b'])
# 获取唯一元素及对应出现次数
unique_vals, counts = np.unique(arr, return_counts=True)
# 筛选出出现多次的元素
targets = unique_vals[counts > 1]
# 收集每个目标元素的索引并转成列表
result = [np.where(arr == val)[0].tolist() for val in targets]
print(result)  # 输出 [[0, 3, 4], [1, 5]]

注意:np.unique返回的是排序后的唯一元素,若需要严格保持原列表中元素首次出现的顺序,可额外添加逻辑记录首次出现顺序后再筛选。

Pandas实现

利用Series的groupby和indices属性快速获取分组索引:

import pandas as pd

s = pd.Series(['a', 'b', 'c', 'a', 'a', 'b'])
# 按元素分组,获取每组的索引数组
group_indices = s.groupby(s).indices
# 筛选出长度大于1的索引列表,保持分组顺序(即元素首次出现顺序)
result = [indices.tolist() for val, indices in group_indices.items() if len(indices) > 1]
print(result)  # 输出 [[0, 3, 4], [1, 5]]

Pandas的groupby默认会保留元素首次出现的顺序,无需额外处理即可得到符合示例的结果。


内容的提问来源于stack exchange,提问作者beginner_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:47:06