鱼C论坛

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

[已解决]一个关于for循环的小问题

[复制链接]
发表于 2019-4-4 18:35:25 | 显示全部楼层 |阅读模式

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

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

x
代码是这样的
list1=['','','',2,3,2,3] #这里的''就是引号里啥都没,也是一个元素。
for i in list1:
     if i=='':
        list1.remove(i)  #就是只要是''这个元素就删了
      
print(list1)
但是最后输出是这样的:['',2,3,2,3]
很明显''没有被删完
求问这是为啥?


最佳答案
2019-4-4 20:11:41
本帖最后由 137118510 于 2019-4-4 20:13 编辑

['',2,3,2,3]  这个是结果


list1=['','','',2,3,2,3] 给三个 '' 元素取名  0 , 1 ,2
我在网上查找,大概是这个意思
第一次循环,第一个元素 0 被识别出来并且被删除,然后第二个元素 1 往前一个位置,
变成['','',2,3,2,3]  这里的第一元素是原始列表里的1 第二个是原始列表里的2,
当第二次运行for循环,电脑会跳过第一个,因为第一个已经遍历过,可是电脑没发现,现在的list1
的第一个元素是原始列表的第二个元素 1 ,现在列表list1的第二个元素是 2 ,电脑运行,出发if条件,
并且删除空格 2 ,之后的2,3,2,3没有触发if条件

所以print(lisr1)的第一个元素是原列表里的第二个元素


不知道这样能不能理解
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-4-4 19:52:12 | 显示全部楼层
因为你的 list1  是在变化的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-4 20:11:41 | 显示全部楼层    本楼为最佳答案   
本帖最后由 137118510 于 2019-4-4 20:13 编辑

['',2,3,2,3]  这个是结果


list1=['','','',2,3,2,3] 给三个 '' 元素取名  0 , 1 ,2
我在网上查找,大概是这个意思
第一次循环,第一个元素 0 被识别出来并且被删除,然后第二个元素 1 往前一个位置,
变成['','',2,3,2,3]  这里的第一元素是原始列表里的1 第二个是原始列表里的2,
当第二次运行for循环,电脑会跳过第一个,因为第一个已经遍历过,可是电脑没发现,现在的list1
的第一个元素是原始列表的第二个元素 1 ,现在列表list1的第二个元素是 2 ,电脑运行,出发if条件,
并且删除空格 2 ,之后的2,3,2,3没有触发if条件

所以print(lisr1)的第一个元素是原列表里的第二个元素


不知道这样能不能理解
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-4 20:24:06 | 显示全部楼层
怎么又是这个问题啊
看这个帖子你就明白了
https://fishc.com.cn/thread-133091-1-11.html
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-4 20:27:59 | 显示全部楼层
for 是遍历,我按照步骤给你搞一下

开始list1=['','','',2,3,2,3]
i =''(第一个)
if 判读后执行remove,然后列表变为list1=['','',2,3,2,3]

循环第二次:i=''(当前列表第二个,实际是原列表第三个)
if 判读后执行remove,然后列表变为list1=['',2,3,2,3]

循环第三次:i=3,(当前列表第三个,实际是原列表第五个)
if 判断后,不执行remove

往下都一样,都不会删除,所以最后的列表为list1=['',2,3,2,3]

明白了吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-4 21:12:10 | 显示全部楼层
    只要改动一点点就可以达到目的:
  1. list1 = ['' , '' , '' , 2 , 3 , 2 , 3]
  2. for i in list1[:]:
  3.      if i == '':
  4.         list1 . remove(i)
  5.       
  6. print(list1)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-4 21:31:57 | 显示全部楼层
建议decopy一次,然后你在操作,建议,注意,不要在循环一个列表的时候,对列表进行,删,增,的操作
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-5 10:53:15 | 显示全部楼层
jackz007 发表于 2019-4-4 21:12
只要改动一点点就可以达到目的:

哇!对原列表切片一下就可以了欸!请问这是什么原理???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-5 11:51:07 | 显示全部楼层
本帖最后由 jackz007 于 2019-4-5 12:37 编辑
deku_desu 发表于 2019-4-5 10:53
哇!对原列表切片一下就可以了欸!请问这是什么原理???


      先切片再遍历,不论在循环中对列表如何操作,都能保证遍历到每一个元素;

      如果采用索引遍历,只要在循环过程中,不要对列表进行增减元素的操作,也可以成功遍历到每一个元素,但是,如果有增减元素的操作,那就完全不一样了。

      例如,首次循环索引到 list1[0],如果删除掉这个元素,那么,后续元素将整体递进,索引顺序将完全改变,原来的 list1[1] 会成为新的 list1[0],下次循环将遍历到 list1[1], 显然,这个 list1[1],实际上已经是原来的 list1[2] 了,从而漏过了原来列表中的 list1[1],而且,删除几个元素,就会漏掉同样多的后续元素。这就是楼主代码不能把目标元素删除干净的根本原因。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-4-5 18:46:34 | 显示全部楼层
这个只是执行每一行代码  但是不执行删除
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-6 09:50:04 | 显示全部楼层
本帖最后由 xm_zhu 于 2019-4-6 10:23 编辑
jackz007 发表于 2019-4-5 11:51
先切片再遍历,不论在循环中对列表如何操作,都能保证遍历到每一个元素;

      如果采用索引 ...


谢谢,我今天也有同样问题,看明白了。
但是先切片再遍历,会导致执行效率低么?
所以我觉得还是用 while ,用in 来判断是否包含来得简单
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-8 23:26:12 | 显示全部楼层
jackz007 发表于 2019-4-5 11:51
先切片再遍历,不论在循环中对列表如何操作,都能保证遍历到每一个元素;

      如果采用索引 ...

哦我懂了!谢谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-5 02:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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