【问题标题】:Find the indexes of unique elements of a list in python?在python中查找列表的唯一元素的索引?
【发布时间】:2019-11-11 20:01:22
【问题描述】:

我有一个这样的列表:

l=[1,2,2,3,4,5,5,5]

我们可以看到列表列表包含 5 个唯一值,总计 8 个值。

我想要列表格式的列表中唯一值的索引。

所以输出看起来像:

indexes=[0,1,3,4,5]

如何使用python最有效的方式?

【问题讨论】:

  • 如果这是熊猫系列,就做pd.Series(l).drop_duplicates().index否则如果这是一个列表,你不需要熊猫,
  • l.index[~l.duplicated()]l 是一个系列
  • 这是一个专门的熊猫问题吗?它被标记为pandas,但问题中没有特定于熊猫的内容。
  • 你解决这个问题的方法在哪里?您的代码有什么具体问题?你的minimal reproducible example 在哪里?你尝试了什么?
  • 请同时发布您尝试解决问题的代码。在目前的状态下,您的问题没有任何努力。

标签: python list indexing


【解决方案1】:

如果这不是特定于 pandas 的问题,并且 l 只是一个普通的旧列表,我会检查它并保留一个从值到保存它的第一个索引的有序映射。然后,您可以返回地图值:

from collections import OrderedDict
def get_unique_indexes(l):
    # OrdedDict is used to preserve the order of the indexes
    result = OrderedDict()
    for i in range(0, len(l)):
        val = l[i]
        if not val in result:
            result[val] = i

    return result.values()

【讨论】:

  • 我会使用 for i, val in enumerate(l): 而不是 range 和 len。
【解决方案2】:

您可以遍历您的列表。当您第一次看到一个项目时,将其添加到一个表明它已被看到的集合中,并将数字添加到结果列表中。跳过其他。这将使索引保持项目在列表中首次出现的顺序:

def uniqueIndexes(l):
    seen = set()
    res = []
    for i, n in enumerate(l):
        if n not in seen:
            res.append(i)
            seen.add(n)
    return res

l=[1,2,2,3,4,5,5,5,2]

uniqueIndexes(l)

结果:

[0, 1, 3, 4, 5]

【讨论】:

    【解决方案3】:

    您可以为此使用内置类型。

    代码

    l=[1,2,2,3,4,5,5,5]
    
    indexes = [l.index(x) for x in set(l)]
    

    解释

    • set
      列表中的所有唯一成员。
    • list.index
      返回元素的第一个索引。

    评论

    正如 cmets 中所指出的,如果顺序对您很重要,您可以在 set 或生成的索引列表中使用 sorted,具体取决于提供的数据。如果数据已经排序,我建议这样做:

    indexes = [l.index(x) for x in sorted(set(l))]
    

    【讨论】:

    • index() 将返回第一次出现的位置
    • 对,@mamun 但set(l) 会按顺序迭代项目吗?
    • 是的,没错。他需要稍后执行sort() 才能使索引的顺序正确,或者需要更好的方法。
    • @MarkMeyer 不是由 OP 指定的,但我们可以使用 sorted 来按顺序排列索引... @mamun "s.index(x) = 第一次出现 x 的索引在 s" - 来自here
    【解决方案4】:

    这是可以做到的:

    l=[1,2,2,3,4,5,5,5] # Your list
    indexes=[] # Your output list
    for elem in set(l):
           indexes.append(l.index(elem))
    

    在for循环中,取集合的每个元素,并使用list.index()方法取出列表中元素的索引(返回所需类型的第一个元素的索引)和值被插入到索引列表中。

    这就是它的工作原理。(我喜欢解释,所以请为我的冗长文章道歉!)

    谢谢。

    【讨论】:

      【解决方案5】:

      为什么这里没有人提到np.unique??

      import numpy as np
      np.unique([1,6,6,2,2,3,4,5,5,5], return_index=True)
      
      >>> (array([1, 2, 3, 4, 5, 6]), array([0, 3, 5, 6, 7, 1], dtype=int64))
      

      第一个数组包含 (sorted) 唯一值,第二个数组(如果 return_index 设置为 True 则返回)是第一次出现的索引列表

      【讨论】:

        猜你喜欢
        • 2021-06-25
        • 1970-01-01
        • 2010-11-16
        • 2019-10-10
        • 2019-09-19
        • 2023-03-16
        • 2021-07-16
        • 2016-02-29
        • 2023-03-24
        相关资源
        最近更新 更多