lbf4325 发表于 2023-9-13 15:33:52

关于用for循环配合remove,删除列表中重复元素的问题。

isdkz 发表于 2023-9-13 15:34:04

可以使用一个for循环配合remove来删除列表中的重复元素,但是需要注意一些问题。首先,如果从前往后遍历列表并删除元素,会导致后面的元素下标发生变化,可能会导致一些元素被漏掉或者多次删除同一个元素。因此,建议从后往前遍历列表并删除元素,这样可以避免上述问题。其次,需要注意的是,如果在循环中使用remove删除元素,可能会导致循环过程中列表的长度发生变化,也可能会导致一些元素被漏掉或者多次删除同一个元素。因此,建议在循环外先使用set函数去重,然后再使用for循环遍历列表进行其他操作。以下是一个示例代码:



lst =

lst = list(set(lst))

for i in range(len(lst)-1, -1, -1):

    if lst.count(lst[ i]) > 1:

      lst.remove(lst[ i])

print(lst)





运行结果为:

lbf4325 发表于 2023-9-13 15:34:37

list1 =
for i in list1:
    if i == 3:
      list1.remove(i)
print(list1)

yinda_peng 发表于 2023-9-13 17:30:32


删除第一个三,此时i = 3





删除第一个3之后跑下一个元素时,i = 1
那么也就是说for i in XXX实际上还是在用索引在处理
删除第一个3之后,索引在,下一次循环索引加一变成
但是此时由于列表被删掉了一个元素,后面的下标往前移了一位,所以原列表的就被忽略了

lbf4325 发表于 2023-9-13 22:33:58

yinda_peng 发表于 2023-9-13 17:30
删除第一个三,此时i = 3




解释明白, 就是当 索引=2的时候发现第1个3,然后执行删除此时原列表已经变成了,for继续循环,索引继续+1,此时索引=3,此时索引对应列表中的 元素1,直接跳过了后一个元素3。变成索引对应元素为1

现在又有了一个疑问,就是for 循环几次由起初列表里面有几个元素决定是吗?毕竟循环到第一个3的时候此时列表已经少了一个元素 如果继续for循环那么for循环的次数不应该也减少1次吗?

想了一下,好像需要循环的总次数也跟着列表元素总数的少1个,也减少了1次,因为少了1元素,循环到第4次,如果按照起初列表中个数来循环,应该循环5次,但是继续循环就已经出界了。所以只循环4次!是不是python有个机制就是循环时索引是单独开辟的一个空间记录循环的次数,不随着列的变化而变化,也就是说我的循环索引从0开始,执行1次就记+1,即使可迭代对象元素总量实时更新,只要索引累加的总数还没达到,实时更新的类表总元素个数,我就继续循环!

cjjJasonchen 发表于 2023-9-14 09:37:12

本帖最后由 cjjJasonchen 于 2023-9-14 09:42 编辑

lbf4325 发表于 2023-9-13 22:33
解释明白, 就是当 索引=2的时候发现第1个3,然后执行删除此时原列表已经变成了,for继续循环, ...


python 的退出for循环机制是next()报错就退出,更迭代次数无关(for循环其实就是把要迭代的东西转换成迭代器)

你可以试试对一个迭代器使用next()方法



如下:
a = iter()
next(a)
1
next(a)
2
next(a)
3
next(a)
4
next(a)
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
    next(a)
StopIteration

当发生stopiteration错误时,for就会退出循环,这与迭代次数无关

cjjJasonchen 发表于 2023-9-14 09:43:14

还有,建议有新问题的话重新发帖,这样平台才会对回答问题的同学发奖励{:10_277:}

lbf4325 发表于 2023-9-14 10:29:57

cjjJasonchen 发表于 2023-9-14 09:37
python 的退出for循环机制是next()报错就退出,更迭代次数无关(for循环其实就是把要迭代的东西转 ...

1、其实我所谓的迭代次数,就是可迭代对象里面的成员个数,也是迭代器能next()多少次不报错,next()==迭代动作,我的定义是迭代1次==next()1次

2、我认为next方法受可迭代对象成员个数的影响,成员有多少就决定他能next()几次不出现错误,对不?我举得上头那个例子,list1迭代对象是每迭代一次列表就刷新1次。我在你们的回答的基础上的得到理解是:即使被迭代的对象随着迭代的进行,内容时时发生改变,只要next()出错也就是没有元素可以next()了那就退出for循环

3、还是我只之前的老疑问,就是迭代会记住上次迭代到了那个索引位置(即使你的迭代对象内容实时变动),下次迭代索引+1继续,这个是明确的吧 .

cjjJasonchen 发表于 2023-9-14 10:35:53

lbf4325 发表于 2023-9-14 10:29
1、其实我所谓的迭代次数,就是可迭代对象里面的成员个数,也是迭代器能next()多少次不报错,next()== ...

正确的{:10_254:}

lbf4325 发表于 2023-9-14 10:36:38

cjjJasonchen 发表于 2023-9-14 09:43
还有,建议有新问题的话重新发帖,这样平台才会对回答问题的同学发奖励

建议收到

lbf4325 发表于 2023-9-14 10:38:07

isdkz 发表于 2023-9-13 15:34
可以使用一个for循环配合remove来删除列表中的重复元素,但是需要注意一些问题。首先,如果从前往后遍历列 ...

感谢解答

lbf4325 发表于 2023-9-14 10:42:41

cjjJasonchen 发表于 2023-9-14 10:35
正确的

好的感谢,确实每一个人的回答都能更进一步的去理解,你们的解答都很好,但是只能设置一个最佳{:5_109:}这就是你刚建议重新发帖的意义吧。
页: [1]
查看完整版本: 关于用for循环配合remove,删除列表中重复元素的问题。