Python 将元素映射到唯一索引列表
假设我有一个元素列表:Python 将元素映射到唯一索引列表,python,list,unique,Python,List,Unique,假设我有一个元素列表: my_list = ['CatA', 'CatB', 'CatC', 'CatA', 'CatA', 'CatC'] 我想把这个列表转换成唯一元素的索引列表 因此,将CatA分配给索引0,CatB分配给索引1,CatC分配给索引2 我期望的结果是: result = [0, 1, 2, 0, 0, 2] 目前,我正在创建一个字典,为每个元素分配唯一的id,然后使用列表理解创建最终的索引列表: unique_classes = np.unique(my_list) co
my_list = ['CatA', 'CatB', 'CatC', 'CatA', 'CatA', 'CatC']
我想把这个列表转换成唯一元素的索引列表
因此,将CatA
分配给索引0,CatB
分配给索引1,CatC
分配给索引2
我期望的结果是:
result = [0, 1, 2, 0, 0, 2]
目前,我正在创建一个字典,为每个元素分配唯一的id
,然后使用列表理解创建最终的索引列表:
unique_classes = np.unique(my_list)
conversion_dict = dict(unique_classes, range(len(unique_classes))
result = [conversion_dict[i] for i in my_list]
我的问题是:有没有更简单、更直接的方法
我正在考虑建立一个大的类别列表,因此它需要高效,但不允许我手动创建唯一列表、字典和列表理解。这将实现以下目的:
my_list = ['CatA', 'CatB', 'CatC', 'CatA', 'CatA', 'CatC']
first_occurances = dict()
result = []
for i, v in enumerate(my_list):
try:
index = first_occurances[v]
except KeyError:
index = i
first_occurances[v] = i
result.append(index)
复杂性将是O(n)
基本上,您要做的是将第一个值存储在dict
索引中。如果第一次发生的没有值v
,则保存当前索引i
result = [my_list.index(l) for l in my_list]
print(result)
[0, 1, 2, 0, 0, 2]
index()返回任务所需的第一次出现的索引
有关更多详细信息,请检查您可以使用scikit learn中的标签编码器来执行此操作。它将为列表中的每个唯一值分配标签
示例代码:
from sklearn.preprocessing import LabelEncoder
my_list = ['CatA', 'CatB', 'CatC', 'CatA', 'CatA', 'CatC']
le = LabelEncoder()
print(le.fit(my_list).transform(my_list))
根据@mikey的建议,您可以使用np.unique
,如下所示:
import numpy as np
my_list = ['CatA', 'CatB', 'CatC', 'CatA', 'CatA', 'CatC']
res = np.unique(my_list, return_inverse=True)[1]
结果:
[0 1 2 0 0 2]
numpy.unique是一个用于此的方法(我不记得哪个kwarg必须设置为True,但它在numpy文档中)。是的,我喜欢此解决方案。我不知道np.uniqueYup中的这个选项,但是这是非常不合理的,你能告诉我这个答案有什么问题吗?为什么这个答案没有用