博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python循环删除列表元素常见错误与正确方法
阅读量:6708 次
发布时间:2019-06-25

本文共 1834 字,大约阅读时间需要 6 分钟。

python循环删除列表元素

觉得有用的话,欢迎一起讨论相互学习~

常见错误

常见错误一:使用固定长度循环删除列表元素

# 使用固定长度循环pop方法删除列表元素num_list_1 = [1, 2, 2, 2, 3]for i in range(len(num_list_1)):    if num_list_1[i] == 2:        num_list_1.pop(i)    else:        print(num_list_1[i])print("num_list_1:", num_list_1)# IndexError: list index out of range
  • 原因是在删除list中的元素后,list的实际长度变小了,但是循环次数没有减少,依然按照原来list的长度进行遍历,所以会造成索引溢出

    常见错误二:正序循环遍历删除列表元素

  • 不能删除连续的情况

# 正序循环遍历删除列表元素num_list_2 = [1, 2, 2, 2, 3]for item in num_list_2:    if item == 2:        num_list_2.remove(item)    else:        print("item", item)    print("num_list_2", num_list_2)print("after remove op", num_list_2)# item 1# num_list [1, 2, 2, 2, 3]# num_list [1, 2, 2, 3]# num_list [1, 2, 3]# after remove op [1, 2, 3]

949241-20181126155417724-1082059922.png

  • 思考了下,知道了原因,当符合条件,删除元素[2]之后,后面的元素全部往前移,但是索引并不会随着值向前移动而变化,而是接着上一个位置向后移动。这样就会漏掉解

正确的方法

正确的方法一:倒序循环遍历

# 倒序循环遍历删除列表元素num_list_3 = [1, 2, 2, 2, 3]for item in num_list_3[::-1]:    if item == 2:        num_list_3.remove(item)    else:        print("item", item)    print("num_list_3", num_list_3)print("after remove op", num_list_3)# item 3# num_list_3 [1, 2, 2, 2, 3]# num_list_3 [1, 2, 2, 3]# num_list_3 [1, 2, 3]# num_list_3 [1, 3]# item 1# num_list_3 [1, 3]# after remove op [1, 3]

949241-20181126162123695-930259660.png

正确的方法二:遍历拷贝的list,操作原始的list

  • 原始的list是num_list,那么其实,num_list[:]是对原始的num_list的一个拷贝,是一个新的list,所以,我们遍历新的list,而删除原始的list中的元素,则既不会引起索引溢出,最后又能够得到想要的最终结果。此方法的缺点可能是,对于过大的list,拷贝后可能很占内存。那么对于这种情况,可以用倒序遍历的方法来实现。
# 遍历拷贝的list,操作原始的listnum_list_4 = [1, 2, 2, 2, 3]for item in num_list_4[:]:    if item == 2:        num_list_4.remove(item)    else:        print("item", item)    print("num_list_4", num_list_4)print("after remove op", num_list_4)# item 1# num_list_4 [1, 2, 2, 2, 3]# num_list_4 [1, 2, 2, 3]# num_list_4 [1, 2, 3]# num_list_4 [1, 3]# item 3# num_list_4 [1, 3]# after remove op [1, 3]

转载于:https://www.cnblogs.com/cloud-ken/p/10021266.html

你可能感兴趣的文章
项目案例分享四:DC升级后Sysvol停止复制,日志报13508
查看>>
职场思想分享001 | 有多种选择才叫有能力
查看>>
ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)
查看>>
3D圣诞树源码[强力推荐]
查看>>
25 个超棒的 WordPress 主题(2012)
查看>>
Concurrent use of embedded Ruby in Java (using JRuby)
查看>>
基础才是重中之重~.net中的显式事务与隐式事务
查看>>
转载 - 通过设置P3P头来实现跨域访问COOKIE
查看>>
使用泛型创建只读集合
查看>>
SQL Server 中如何判断表是否存在
查看>>
delphi日期格式显示及文件打开方式小结
查看>>
最近看的一些东东
查看>>
POJ 3281 Dining(最大流)
查看>>
SQL Server Management Studio 过期无法使用解决办法
查看>>
Eclipse配置详解(包括智能提示设置、智能提示插件修改,修改空格自动上屏、JDK配置、各种快捷键列表……)...
查看>>
【数据结构】数组和广义表
查看>>
css3中transform的用法
查看>>
为什么Domain controller上的time synchronization非常重要?
查看>>
[转]CDN(内容分发网络)技术原理
查看>>
js中,(function(){})()的用法解析
查看>>