在Python中查找列表中唯一元素的索引?

7

我有一个类似这样的列表:

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

我们可以看到列表“list”包含5个唯一值和8个总值。
我想要在列表格式中获得唯一值的索引。
因此,输出应该是:
indexes=[0,1,3,4,5]

如何使用Python最有效地实现?

7
如果这是一个 pandas 的 Series,只需执行 pd.Series(l).drop_duplicates().index,否则如果这是一个列表,则不需要使用 pandas。 - anky
4
如果l是一个序列(Series),那么l.index[~l.duplicated()]的意思是返回l中不重复元素的索引。 - cs95
3
这是否是一个针对Pandas的问题?虽然标记为 pandas,但在问题中并没有特别涉及到Pandas相关的内容。 - Mark
2
你解决这个问题的方法是什么?你的代码有什么具体的问题?你的最小可重现示例在哪里?你尝试过什么? - Patrick Artner
请同时发布您尝试解决问题的代码。目前,您的问题表明您没有付出努力。 - J...S
5个回答

18

为什么没有人在这里提到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))

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


10

你可以使用内置类型来完成这个任务。

CODE

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

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

解释

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

评论

如评论中指出,如果您认为顺序很重要,可以在提供的数据上使用sorted或结果索引列表上使用sorted。如果数据已经排序,我建议以这种方式执行:

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

index() 函数将返回第一个出现的位置。 - Osman Mamun
对的,@mamun 但是 set(l) 会按顺序迭代项目吗? - Mark
是的,没错。他需要稍后执行 sort() 来获取正确的索引顺序,或者需要有更好的方式。 - Osman Mamun
@MarkMeyer 没有被 OP 指定,但我们可以使用 sorted 使索引有序... @mamun "s.index(x) = s 中 x 的第一次出现的索引" - 来自 这里 - Sven-Eric Krüger

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]

0
如果这不是一个特定于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。 - Dan D.

0

这可以做到:

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()方法获取列表中该元素的索引(该方法返回所需类型的第一个元素的索引),然后将该值插入到索引列表中。
这就是它的工作原理。(我喜欢解释,所以请原谅我的冗长写作!)
谢谢。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接