如何获取列表中匹配元素的索引?是否有内置函数实现?
重复元素索引列表的实现方案
问题描述
我有一个列表,例如['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_
相关产品推荐
相关产品推荐

