为了账号安全,请及时绑定邮箱和手机立即绑定

提取python列表中非重复元素的索引

提取python列表中非重复元素的索引

守着一只汪 2021-06-04 18:47:42
我有一个清单:input = ['a','b','c','a','b','d','e','d','g','g']我想要列表中除重复项之外的所有元素的索引。output = [0,1,2,5,6,8]
查看完整描述

3 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

您应该遍历枚举列表并将每个元素添加到一组“已见”元素中,如果尚未看到该元素(不在“已见”集中),则将索引添加到输出列表中。


哦,这个名字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)比O(n^2)解决方案好得多的解决方案。


查看完整回答
反对 回复 2021-06-08
?
万千封印

TA贡献1891条经验 获得超3个赞

如果您不介意最后一次出现重复项的索引,而是使用 Python 3.6+,这里有一个替代解决方案:

list(dict(map(reversed, enumerate(input))).values())

这将返回:

[3, 4, 2, 7, 6, 9]


查看完整回答
反对 回复 2021-06-08
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

你可以做这样的事情,检查计数(虽然这是计算量很大):


indexes = []

for i, x in enumerate(inputlist):

    if (inputlist.count(x) == 1

        and x not in inputlist[:i]):

        indexes.append(i)

这会检查以下内容:


如果该项目只出现一次。如果是这样,继续...

如果到目前为止该项目尚未出现在列表中。如果是这样,添加到结果列表


查看完整回答
反对 回复 2021-06-08
  • 3 回答
  • 0 关注
  • 570 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信