将列表元素映射为唯一索引列表的实现方法
解决列表元素转唯一索引的问题
这事儿我日常写代码经常碰到,给你分享两个实用的解法,都能轻松把你的分类列表转换成对应的索引列表~
纯Python方案(无需额外库)
如果不想依赖第三方库,用原生Python就能搞定,还能保证元素索引和它们首次出现的顺序一致:
my_list = ['CatA', 'CatB', 'CatC', 'CatA', 'CatA', 'CatC'] # 提取唯一元素,保留首次出现的顺序(Python 3.7+字典默认有序) unique_classes = list(dict.fromkeys(my_list)) # 创建分类到索引的映射字典 class_to_idx = {cls: idx for idx, cls in enumerate(unique_classes)} # 生成最终索引列表 result = [class_to_idx[item] for item in my_list] print(result) # 输出: [0, 1, 2, 0, 0, 2]
原理很简单:dict.fromkeys(my_list)会自动去重并保留元素第一次出现的顺序,之后用enumerate给每个唯一元素分配索引,最后通过列表推导式把原列表的每个元素替换成对应的索引就行。
Numpy方案(高效处理大规模数据)
如果你已经在用numpy处理数据,那直接用np.unique的return_inverse参数就能一步到位:
import numpy as np my_list = ['CatA', 'CatB', 'CatC', 'CatA', 'CatA', 'CatC'] # 获取唯一元素,同时得到原列表元素对应的索引 unique_classes, indices = np.unique(my_list, return_inverse=True) # 把numpy数组转成普通列表 result = indices.tolist() print(result) # 输出: [0, 1, 2, 0, 0, 2]
⚠️ 注意:np.unique默认会对唯一元素进行排序,刚好你的例子里CatA、CatB、CatC排序后和首次出现顺序一致,所以结果没问题。如果你的分类元素排序后和首次出现顺序不同,想要保持原顺序的话,在numpy 1.23+版本可以加order='stable'参数:
unique_classes, indices = np.unique(my_list, return_inverse=True, order='stable')
两种方案各有优劣:纯Python方案轻量无依赖,适合小数据集;numpy方案效率更高,适合处理大规模数据。按需选择就好~
内容的提问来源于stack exchange,提问作者user2261062
相关产品推荐
相关产品推荐

