我有一个类似这样的列表:
l=[1,2,2,3,4,5,5,5]
我们可以看到列表“list”包含5个唯一值和8个总值。
我想要在列表格式中获得唯一值的索引。
因此,输出应该是:
indexes=[0,1,3,4,5]
如何使用Python最有效地实现?
为什么没有人在这里提到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
,则第二个数组是第一次出现索引的列表。
你可以使用内置类型来完成这个任务。
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))]
set(l)
会按顺序迭代项目吗? - Marksort()
来获取正确的索引顺序,或者需要有更好的方式。 - Osman Mamunsorted
使索引有序... @mamun "s.index(x) = s 中 x 的第一次出现的索引" - 来自 这里 - Sven-Eric Krüger您只需遍历列表即可。第一次看到一个项,将其添加到表示已查看的集合中,并将数字添加到结果列表中。跳过其他项。这将保持项目按照它们在列表中首次出现的顺序排列:
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]
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.这可以做到:
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))
pd.Series(l).drop_duplicates().index
,否则如果这是一个列表,则不需要使用 pandas。 - ankyl
是一个序列(Series),那么l.index[~l.duplicated()]
的意思是返回l
中不重复元素的索引。 - cs95pandas
,但在问题中并没有特别涉及到Pandas相关的内容。 - Mark