您应该遍历枚举列表并将每个元素添加到一组“已看到”元素并将索引添加到输出列表如果该元素尚未被看到(不在“看见”的集合)。
哦,input 这个名字覆盖了内置的input() 函数,所以我把它改名为input_list。
output = []
seen = set()
for i,e in enumerate(input_list):
if e not in seen:
output.append(i)
seen.add(e)
将output 设为[0, 1, 2, 5, 6, 8]。
为什么要使用套装?
你可能会想,既然可以做这样的事情,为什么还要使用集合:
[i for i,e in enumerate(input_list) if input_list.index(e) == i]
这会起作用,因为.index 会为您返回具有该值的列表中第一个元素的索引,因此如果您对照此检查元素的索引,您可以断言它是该元素的第一次出现并且过滤掉那些不是第一次出现的元素。
但是,这不如使用集合有效,因为list.index 需要 Python 遍历列表,直到找到元素(或没有找到)。这个操作是O(n) 复杂性,因为我们为input_list 中的每个元素调用它,所以整个解决方案将是O(n^2)。
另一方面,与第一个解决方案一样,使用集合会产生O(n) 解决方案,因为检查一个元素是否为in 集合是复杂性O(1)(平均情况)。这是由于集合是如何实现的(它们就像列表,但每个元素都存储在其哈希的索引处,因此您可以计算一个元素的哈希并查看是否有一个元素来检查成员资格而不是迭代它 - 请注意,这是一个模糊的过度简化,但这是他们的想法)。
因此,由于每个成员资格检查都是O(1),并且我们对每个元素都执行此操作,因此我们得到一个比O(n^2) 解决方案好得多的O(n) 解决方案。