鱼C论坛

 找回密码
 立即注册
查看: 1719|回复: 11

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

[复制链接]
发表于 2023-9-13 15:33:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
微信图片编辑_20230913153327.jpg
最佳答案
2023-9-13 17:30:32
屏幕截图 2023-09-13 172434.png

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

屏幕截图 2023-09-13 172454.png

屏幕截图 2023-09-13 172549.png


删除第一个3之后跑下一个元素时,i = 1

那么也就是说for i in XXX实际上还是在用索引在处理

删除第一个3之后,索引在[2],下一次循环索引加一变成[3]

但是此时由于列表被删掉了一个元素,后面的下标往前移了一位,所以原列表的[3]就被忽略了

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


lst = [1, 2, 3, 2, 4, 3, 5, 6, 5]

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)


运行结果为:[1, 2, 3, 4, 5, 6]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-13 15:34:37 | 显示全部楼层
list1 = [2,2,3,3,1]
for i in list1:
    if i == 3:
        list1.remove(i)
print(list1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-13 17:30:32 | 显示全部楼层    本楼为最佳答案   
屏幕截图 2023-09-13 172434.png

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

屏幕截图 2023-09-13 172454.png

屏幕截图 2023-09-13 172549.png


删除第一个3之后跑下一个元素时,i = 1

那么也就是说for i in XXX实际上还是在用索引在处理

删除第一个3之后,索引在[2],下一次循环索引加一变成[3]

但是此时由于列表被删掉了一个元素,后面的下标往前移了一位,所以原列表的[3]就被忽略了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-13 22:33:58 | 显示全部楼层
yinda_peng 发表于 2023-9-13 17:30
删除第一个三,此时i = 3

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

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

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

使用道具 举报

发表于 2023-9-14 09:37:12 | 显示全部楼层
本帖最后由 cjjJasonchen 于 2023-9-14 09:42 编辑
lbf4325 发表于 2023-9-13 22:33
解释明白, 就是当 索引=2的时候发现第1个3,然后执行删除此时原列表已经变成了[2,2,3,1],for继续循环, ...



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

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



如下:
a = iter([1,2,3,4])
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就会退出循环,这与迭代次数无关
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-14 09:43:14 | 显示全部楼层
还有,建议有新问题的话重新发帖,这样平台才会对回答问题的同学发奖励
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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继续,这个是明确的吧 .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

正确的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-14 10:36:38 | 显示全部楼层
cjjJasonchen 发表于 2023-9-14 09:43
还有,建议有新问题的话重新发帖,这样平台才会对回答问题的同学发奖励

建议收到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

感谢解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-14 10:42:41 | 显示全部楼层

好的感谢,确实每一个人的回答都能更进一步的去理解,你们的解答都很好,但是只能设置一个最佳这就是你刚建议重新发帖的意义吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 12:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表