【问题标题】:Map elements to list of unique indexes将元素映射到唯一索引列表
【发布时间】:2018-03-22 10:40:46
【问题描述】:

假设我有一个元素列表:

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]

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

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

【问题讨论】:

  • numpy.unique 是一种方法(我不记得哪个 kwarg 必须设置为 True,但它在 numpy 文档中)。

标签: python list unique


【解决方案1】:

按照@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]

【讨论】:

  • 是的,我喜欢这个解决方案。我不知道 np.unique 中有这个选项
【解决方案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

【讨论】:

  • 投反对票,你能不能告诉答案有什么问题以及为什么这个答案没有用?:)
【解决方案3】:

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

【讨论】:

    【解决方案4】:
    result = [my_list.index(l) for l in my_list]
    print(result)
    [0, 1, 2, 0, 0, 2]
    

    list.index() 根据您的任务要求返回第一次出现的索引。

    更多详情请查看list.index()

    【讨论】:

    • 是的,但这太无能了
    猜你喜欢
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 2021-06-18
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2021-11-30
    相关资源
    最近更新 更多