将元素映射到唯一索引列表

时间:2018-03-22 10:40:46

标签: 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)
conversion_dict = dict(unique_classes, range(len(unique_classes))
result = [conversion_dict[i] for i in my_list]

我的问题是:有没有更简单直接的方法呢?

我正在考虑拥有一个很大的类别列表,因此它需要高效但却阻止我手动创建唯一列表,字典和列表理解。

4 个答案:

答案 0 :(得分:2)

这样可以解决问题:

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索引。如果first_occurances没有值v,那么我们会保存当前索引i

答案 1 :(得分:2)

根据@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]

答案 2 :(得分:1)

您可以使用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))

答案 3 :(得分:-1)

result = [my_list.index(l) for l in my_list]
print(result)
[0, 1, 2, 0, 0, 2]

list.index()返回任务所需的第一次出现的索引。

有关详细信息,请查看documentation