鱼C论坛

 找回密码
 立即注册
查看: 1073|回复: 10

[已解决]Python列表元素删除问题

[复制链接]
发表于 2018-12-12 22:25:25 | 显示全部楼层 |阅读模式

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

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

x
近日在写Python代码的时候,发现列表删除元素的时候,有一个问题,具体如下:
  1. list1 = [1, 2, 2, 2, 5, 2]
  2. for a in list1 :
  3.         if a == 2 :
  4.                 list1.remove(2)
  5. print(list1)
复制代码

按理来说,想也想的到,得到的结果是 [1, 5]
但是最后的结果却是 [1, 5, 2]
网上查了下,说是因为列表的长度改变了,所以每次找到的索引都会发生改变,但是如果列表是 [1, 2, 3, 2, 5, 2],仅是修改中间一个元素,得到的结果就是 [1, 3, 5],这里列表的长度也发生了改变,但是结果却与预期一致,求各位大神详细讲解下具体原因,谢谢。
最佳答案
2018-12-13 15:16:46
本帖最后由 heidern0612 于 2018-12-13 15:23 编辑
foxiangzun 发表于 2018-12-13 15:09
感谢解答,网上给的解决方案里,也有这样的处理方式,但是我不太明白的是,为什么加了一个分片就好了,如 ...


你不加分片复制的话,for循环还在循环,但是你元素越来越少,再次for循环遍历的时候就会出现索引错误或者像你上面那种错误现象。


加分片复制我遍历的是分片复制,分片复制怎么遍历都无所谓,因为我移除的不是分片,而是本体,两者不干扰。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-12-12 22:39:36 | 显示全部楼层
第一个是因为你删了一个2,下个2补到这个位置上,下次循环就循环不到这个补位置的2,
而你第二个2不挨着,所以可以

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
heidern0612 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-12-13 12:01:30 | 显示全部楼层
  1. list1 = [1, 2, 2, 2, 5, 2]
  2. for a in list1 :
  3.         if a == 2 :
  4.                 list1.remove(2)
  5.         print(a)
  6. print(list1)
  7. 1
  8. 2
  9. 2
  10. 2
  11. [1, 5, 2]
复制代码

你可以看到 其实5和2都没有print出来,被忽略掉了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-13 12:18:27 | 显示全部楼层
本帖最后由 heidern0612 于 2018-12-13 12:19 编辑

这么写很危险,容易导致各种乱七八糟和莫名其妙的错误,老师好像还特意强调过。

你可以这么写,简单的复制一下:
  1. list1 = [1, 2, 2, 2, 5, 2]
  2. list2 = list1[:]
  3. for a in list2 :
  4.         if a == 2 :
  5.                 list1.remove(2)
  6. print(list1)
复制代码


结果是【1,5】,就达到你想要的效果了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-13 15:05:49 | 显示全部楼层
塔利班 发表于 2018-12-12 22:39
第一个是因为你删了一个2,下个2补到这个位置上,下次循环就循环不到这个补位置的2,
而你第二个2不挨着, ...

感谢解答,不过这里如果列表元素相同的值不是挨着的,这里就不会出现这个问题,是为什么呢?虽然不挨着,但是也应该遍历的到呀,如果说在这种情况下会因为每次 remove 而修改列表的长度,但是如果相同元素不挨着,列表的长度也会发生变化,为什么不挨着的时候,就不会出现这种问题呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-13 15:08:22 | 显示全部楼层
zyj321321312 发表于 2018-12-13 12:01
你可以看到 其实5和2都没有print出来,被忽略掉了

感谢解答,请问这里为什么最后的 5 和 2 为什么没有被打印出来呢?如果是因为相同的元素紧挨在一起,那如果不挨着,这种情况就不会有,为什么挨在一起的时候,后续出现的元素就不做删除操作了呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-13 15:09:21 | 显示全部楼层
heidern0612 发表于 2018-12-13 12:18
这么写很危险,容易导致各种乱七八糟和莫名其妙的错误,老师好像还特意强调过。

你可以这么写,简单的复 ...

感谢解答,网上给的解决方案里,也有这样的处理方式,但是我不太明白的是,为什么加了一个分片就好了,如果不加分片,反而就会出现漏删的问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-13 15:16:46 | 显示全部楼层    本楼为最佳答案   
本帖最后由 heidern0612 于 2018-12-13 15:23 编辑
foxiangzun 发表于 2018-12-13 15:09
感谢解答,网上给的解决方案里,也有这样的处理方式,但是我不太明白的是,为什么加了一个分片就好了,如 ...


你不加分片复制的话,for循环还在循环,但是你元素越来越少,再次for循环遍历的时候就会出现索引错误或者像你上面那种错误现象。


加分片复制我遍历的是分片复制,分片复制怎么遍历都无所谓,因为我移除的不是分片,而是本体,两者不干扰。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-13 15:23:39 | 显示全部楼层
foxiangzun 发表于 2018-12-13 15:05
感谢解答,不过这里如果列表元素相同的值不是挨着的,这里就不会出现这个问题,是为什么呢?虽然不挨着, ...

不挨着和我说的一个原理,下一个元素补你删的位置,因为这个补位的元素不需要处理,所以没关系
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-13 15:34:32 | 显示全部楼层
我就想知道为什么连着的3个2全删了,理论上来说不是应该留一个2么,等我想明白了再回来emmmm
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-13 16:10:43 | 显示全部楼层
本帖最后由 heidern0612 于 2018-12-13 16:43 编辑
非黑莫白 发表于 2018-12-13 15:34
我就想知道为什么连着的3个2全删了,理论上来说不是应该留一个2么,等我想明白了再回来emmmm


你是不是觉得应该结果是[1,2,5]而不是[1,5,2]?

你可以看看remove的定义,remove只能匹配删除第一个符合条件的元素。

所以最后一次遍历【1,2,5,2】的时候,匹配到5后面那个2时,本来应该删除5后面那个2。

但是索引的时候,因为前面还有个大难不死的2(增位进的),直接把前面那个2给remove了。

这就是连着三个2消失的原因。

评分

参与人数 1荣誉 +4 鱼币 +4 贡献 +2 收起 理由
非黑莫白 + 4 + 4 + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-1 15:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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