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中的这个选项,但是这是非常不合理的,你能告诉我这个答案有什么问题吗?为什么这个答案没有用