假设我有一个元素列表:
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]
我的问题是:有没有更简单直接的方法呢?
我正在考虑拥有一个很大的类别列表,因此它需要高效但却阻止我手动创建唯一列表,字典和列表理解。
答案 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