(Python)我需要在列表中删除重复的元素(使用remove函数;避免类型转换)。试图确定为什么我的解决方案在

2024-04-20 02:07:56 发布

您现在位置:Python中文网/ 问答频道 /正文

规格: 我想使用remove函数(在列表中),我更喜欢避免类型转换。你知道吗

 l = [2, 3, 3, 4, 6, 4, 6, 5]
    q=len(l)
    for i in range (0, q):
        for g in range (i+1, q):
            if l[g]==l[i]:
                q-=1 #decremented q to account for reduction in list size.
                l.remove(l[g])

    print(l)

错误:if l[g]==l[i]: 索引器错误:列表索引超出范围

我知道以前也有用户问过类似的问题。由于他们没有上述限制,我想请你把这当作一个单独的问题来处理。谢谢!你知道吗


Tags: to函数in列表forlenif错误
3条回答

既然你提到你不想要类型转换,所以我的解决方案是使用while loop

l = [2, 3, 3, 4, 6, 4, 6, 5]
q=len(l)
i = 0
while i<len(l):
    g = i+1
    while (g < q):
        if l[g]==l[i]:
            q-=1 #decremented q to account for reduction in list size.
            l.remove(l[g])
        g += 1
    i += 1

print(l)

现在,请允许我解释一下代码中的问题。当您使用range函数时,它会在循环的第一次运行时保留起始值和结束值,因此即使您在循环的最后更改限制,它也不会更改range循环,因此最终会得到index out of bounds错误。
希望这对您有所帮助:)

>>> l = [2, 3, 3, 4, 6, 4, 6, 5]
>>> s = set(l)
>>> t = sorted(s)
>>> print(t)
[2, 3, 4, 5, 6]

使用set是筛选集合的简单而直接的方法。如果您不需要特定顺序的列表,您可以直接使用上面的集合。sorted函数返回一个列表(使用默认顺序)。你知道吗

您的解决方案不起作用,因为range()存储q的值,稍后将忽略q值的更改。例如:

>>> m = 10
>>> for i in range(m):
...  m=0
...  print(i)
... 
0
1
2
3
4
5
6
7
8
9

即使我改变m,range()仍然会在循环中运行10次。因此,当您更改列表的大小时,即使您更改了q,您仍将尝试访问不再存在的元素。你知道吗

相关问题 更多 >