鱼C论坛

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

[已解决]python之list.remove(),求助!

[复制链接]
发表于 2019-3-27 20:37:55 | 显示全部楼层 |阅读模式

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

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

x
dat=['1', '2', '3', '0', '0', '0']

for item in dat:

    if item == '0':

        dat.remove(item)

print(dat)


为啥输出结果是['1', '2', '3', '0'] ?? 有三个'0'哇
到最后一个'0'的时候直接跳过for循环了,希望有大佬指教一下,感激
最佳答案
2019-3-27 20:43:25
本帖最后由 天圆突破 于 2019-3-27 20:49 编辑

列表的增删操作不要在for循环里做,既不安全也没必要
换句话说,就是不要在循环的时候,让循环体的索引啥的发生变化
这类操作最好新起一个空列表做插入操作,或者复制一个复制表做删操作
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-27 20:43:25 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 天圆突破 于 2019-3-27 20:49 编辑

列表的增删操作不要在for循环里做,既不安全也没必要
换句话说,就是不要在循环的时候,让循环体的索引啥的发生变化
这类操作最好新起一个空列表做插入操作,或者复制一个复制表做删操作
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-27 20:50:21 | 显示全部楼层
for 循环里面的dat做个切片赋新值;
改为dat[:]就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-3-27 21:23:04 | 显示全部楼层
我之前就这么做过,dat不断remove长度不断变化,你可以这么做
  1. dat=['1', '2', '3', '0', '0', '0']
  2. while 1:
  3.     try:
  4.         dat.remove("0")
  5.     except ValueError:
  6.         break
  7. print(dat)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-28 01:20:02 | 显示全部楼层
楼主,原因是用 for 语句读取列表的每个元素时,有类似于文件内容指针或者叫索引的东西存在,这么理解吧
dat = ['1'(第一), '2'(第二), '3(第三)', '0'(第四), '0'(第五), '0'(第六)]


for 语句依次从第一读到第六,然后在你的代码中,读到第四时,执行 if 下代码块,执行完列表变为:
dat = ['1'(第一), '2'(第二), '3(第三)',  '0'(原第五,现第四), '0'(原第六,现第五)]
(补充说明,remove 默认从左到右的顺序删除元素)

然后下一次循环时,for 的指针(暂且这么称呼吧)到第五,执行结果为
dat = ['1'(第一), '2'(第二), '3(第三)',  '0'(原第六,现第四)]

再下一次循环,指针到第六,可是你的第六已经没有元素了!因而  '0'(原第六,现第四)留了下来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-28 07:38:13 | 显示全部楼层
luoydqsn 发表于 2019-3-28 01:20
楼主,原因是用 for 语句读取列表的每个元素时,有类似于文件内容指针或者叫索引的东西存在,这么理解吧
d ...

我测试了多个零的情况,确实没有删掉的零就增多了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-28 21:46:33 | 显示全部楼层
一X一 发表于 2019-3-28 07:38
我测试了多个零的情况,确实没有删掉的零就增多了

就像楼上说的,尽量不要对列表用 for 语句进行增减元素的操作,有很大风险~如果可以,给我个最佳答案呗嘻嘻
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-28 21:58:45 | 显示全部楼层
luoydqsn 发表于 2019-3-28 21:46
就像楼上说的,尽量不要对列表用 for 语句进行增减元素的操作,有很大风险~如果可以,给我个最佳答案呗嘻 ...


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

使用道具 举报

发表于 2019-3-29 00:57:28 | 显示全部楼层

那楼主倒是给个“最佳答案”啊~在你的帖子页面有显示的,具体在哪我忘了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-29 10:30:54 | 显示全部楼层
luoydqsn 发表于 2019-3-28 01:20
楼主,原因是用 for 语句读取列表的每个元素时,有类似于文件内容指针或者叫索引的东西存在,这么理解吧
d ...

一看都是大神,
楼主把迭代对象的内容都改了,迭代的时候肯定会出问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-6 09:42:03 | 显示全部楼层
本帖最后由 xm_zhu 于 2019-4-6 10:23 编辑

我也学习了下,解决了我的问题。
用切片我担心会运行慢

还是用while好
dat=['1', '2', '3', '0', '0', '0']
while 0 in dat:
    dat.remove(0)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 05:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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