规格: 我想使用删除功能(在列表中(,我宁愿避免类型转换。
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]:
索引错误:列出索引超出范围
我知道用户以前也问过类似的问题。由于其中没有上述限制,我想请你把这个问题作为一个单独的问题来处理。谢谢!
>>> l = [2, 3, 3, 4, 6, 4, 6, 5]
>>> s = set(l)
>>> t = sorted(s)
>>> print(t)
[2, 3, 4, 5, 6]
使用set
是筛选集合的一种简单直接的方法。如果您不需要按特定顺序排列的列表,则可以从那里开始使用该集。sorted
函数返回一个列表(使用默认排序(。
既然你提到你不想要类型转换,所以我的解决方案是使用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)
现在,请允许我解释一下您的代码中存在的问题。当您使用范围函数时,它会在循环的第一次运行时保留起始值和结束值,因此即使您之后在循环中更改限制,它仍然不会更改范围循环,因此最终会出错index out of bounds
。
希望这对您:)有所帮助
您的解决方案不起作用,因为 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,您仍然会尝试访问不再存在的元素。