为什么Python循环没有遍历列表中的每一个元素?
ringa_lee
ringa_lee 2017-04-17 17:25:26
[Python讨论组]

使用的是python3,代码是要通过循环把init_nums中在covered_nums中的元素删除,代码如下:

init_nums = [3, 5, 6, 7, 8, 11]
covered_nums = [5, 8, 4, 2, 1, 3, 11, 17, 26, 13, 20, 10]
for num in init_nums:
    if num in covered_nums:
        init_nums.remove(num)
print(init_nums)

运行结果是:

[5, 6, 7, 11]

[5, 11]covered_nums中但是没有被删除,刚开始我以为错误原因是在循环中改变了init_nums,所以我把init_nums拷贝了一份:

init_nums = [3, 5, 6, 7, 8, 11]
covered_nums = [5, 8, 4, 2, 1, 3, 11, 17, 26, 13, 20, 10]
init_nums_cp = init_nums
for num in init_nums:
    if num in covered_nums:
        init_nums_cp.remove(num)
print(init_nums_cp)

可是结果还是一样的,不知道为什么,刚刚接触Python,请指教,谢谢。

ringa_lee
ringa_lee

ringa_lee

全部回复(3)
ringa_lee

init_nums_cp = init_nums[:]

PHP中文网

看来,在迭代中进行修改list可能很不稳定.建议新建一个list来收集结果.
比如这样.

init_nums = [3, 5, 6, 7, 8, 11]
covered_nums = [5, 8, 4, 2, 1, 3, 11, 17, 26, 13, 20, 10]
result=[]
for num in init_nums:
    if num not in covered_nums:
        result.append(num)
print(result)

改成列表解析,代码会少很多.

t=[r for r in init_nums if r not in covered_nums]
print(t) 

使用filter过滤:

t2=list(filter(lambda x: x not in covered_nums,init_nums))
print(t2)
黄舟

我之前也碰到过这个问题,开始特别纠结。最后,用指针分析了一次就明白了。你如果用remove方法其实是移走了当前元素,所有后面的列表元素都会往前推进,这时候你移到下一个元素时已经跳过一个元素了。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号