代码之家  ›  专栏  ›  技术社区  ›  Sembei Norimaki

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

  •  3
  • Sembei Norimaki  · 技术社区  · 8 年前

    假设我有一个元素列表:

    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 回复  |  直到 8 年前
        1
  •  2
  •   jpp    8 年前

    根据@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
  •  2
  •   vishes_shell hendrixski    8 年前

    这样就可以做到:

    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
  •  1
  •   Jay Dangar Yogita Singh Chauhan    8 年前

    您可以使用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
  •  -1
  •   Geek    8 年前
    result = [my_list.index(l) for l in my_list]
    print(result)
    [0, 1, 2, 0, 0, 2]
    

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

    有关更多详细信息,请查看 list.index()

    推荐文章