python循环删除列表元素

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

常见错误

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

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

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

  • 不能删除连续的情况
  1. # 正序循环遍历删除列表元素
  2. num_list_2 = [1, 2, 2, 2, 3]
  3. for item in num_list_2:
  4. if item == 2:
  5. num_list_2.remove(item)
  6. else:
  7. print("item", item)
  8. print("num_list_2", num_list_2)
  9. print("after remove op", num_list_2)
  10. # item 1
  11. # num_list [1, 2, 2, 2, 3]
  12. # num_list [1, 2, 2, 3]
  13. # num_list [1, 2, 3]
  14. # after remove op [1, 2, 3]

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

正确的方法

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

  1. # 倒序循环遍历删除列表元素
  2. num_list_3 = [1, 2, 2, 2, 3]
  3. for item in num_list_3[::-1]:
  4. if item == 2:
  5. num_list_3.remove(item)
  6. else:
  7. print("item", item)
  8. print("num_list_3", num_list_3)
  9. print("after remove op", num_list_3)
  10. # item 3
  11. # num_list_3 [1, 2, 2, 2, 3]
  12. # num_list_3 [1, 2, 2, 3]
  13. # num_list_3 [1, 2, 3]
  14. # num_list_3 [1, 3]
  15. # item 1
  16. # num_list_3 [1, 3]
  17. # after remove op [1, 3]

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

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

python循环删除列表元素常见错误与正确方法的更多相关文章

  1. python循环删除列表元素留一个问题

    https://www.cnblogs.com/baihualin/p/10698651.html 引用up

  2. Python 中删除列表元素的三种方法

    列表基本上是 Python 中最常用的数据结构之一了,并且删除操作也是经常使用的. 那到底有哪些方法可以删除列表中的元素呢?这篇文章就来总结一下. 一共有三种方法,分别是 remove,pop 和 d ...

  3. Java编程:删除 List 元素的三种正确方法

    删除 List 中的元素会产生两个问题: 删除元素后 List 的元素数量会发生变化: 对 List 进行删除操作可能会产生并发问题: 我们通过代码示例演示正确的删除逻辑 package com.ip ...

  4. python中循环删除列表中元素时的坑!

    循环删除列表中元素时千万别用正序遍历,一定要用反序遍历! 废话不多说,先上案例代码: def test(data): for i in data: data.remove(i) return data ...

  5. python删除列表元素remove,pop,del

    python删除列表元素 觉得有用的话,欢迎一起讨论相互学习~Follow Me remove 删除单个元素,删除首个符合条件的元素,按值删除,返回值为空 List_remove = [1, 2, 2 ...

  6. Python中list列表的常见操作

    Python的list是一个列表,用方括号包围,不同元素间用逗号分隔. 列表的数据项不需要具有相同的类型.(列表还可以嵌套,即列表中的列表) 每个元素都有一个索引(表示位置),从0开始:可以用索引-1 ...

  7. Python11之列表2(获取、删除列表元素、列表分片、拷贝)

    一.获取列表元素值 列表名 [ 索引值 ] 注:索引值从0开始 nameList = ['詹姆斯','字母哥','乐福','威少','乔治','戴维斯'] nameList[0] '詹姆斯' name ...

  8. WCF项目中出现常见错误的解决方法:基础连接已经关闭: 连接被意外关闭

    在我们开发WCF项目的时候,常常会碰到一些莫名其妙的错误,有时候如果根据它的错误提示信息,一般很难定位到具体的问题所在,而由于WCF服务的特殊性,调试起来也不是那么方便,因此往往会花费不少时间来进行跟 ...

  9. centos linux 系统日常管理4 scp,rsync,md5sum,sha1sum,strace ,find Rsync 常见错误及解决方法 第十七节课

    centos linux 系统日常管理4  scp,rsync,md5sum,sha1sum,strace ,find Rsync 常见错误及解决方法  第十七节课 rsync可以增量同步,scp不行 ...

随机推荐

  1. banner 跟随鼠标呈现视差效果

    参考 Element 官网,利用 js / jq 和 css3, 实现某图片随着鼠标移动呈现的视差效果. <!DOCTYPE html> <html> <head> ...

  2. 10、Dockerfile实战-PHP

    一.镜像制作步骤 安装编译依赖包 编译安装 配置 二.编写Dockerfile FROM centos:7 MAINTAINER QUNXUE RUN yum install -y gcc gcc-c ...

  3. JavaScript快速入门-ECMAScript对象介绍

    一.概念介绍 在 ECMAScript 中,所有对象并非同等创建的.一般来说,可以创建并使用的对象有三种:本地对象.内置对象和宿主对象. 要理解这三种对象,先要理解宿主环境. 1.宿主环境 一般宿主环 ...

  4. 用C++实现一个Brainfuck解释器

    Brainfuck是一种极小化的计算机语言,只含有8种运算符,由于fuck在英语中是脏话,这种语言有时被称为brainfck或brainf**,甚至被简称为BF.正如它的名字所暗示,brainfuck ...

  5. camscanner(扫描全能王)功能解析与复现

    早就在用camscanner(扫描全能王)这个软件,感觉很不错. 主要功能: 1.页面截取校正 2.增强处理(灰度与颜色) 刚好最近工作与此相关,静心做点仿真,看看其中的操作原理,也做个demo玩玩. ...

  6. 一、Unity Editor自定义菜单

    官方文档:https://unity3d.com/cn/learn/tutorials/topics/interface-essentials/unity-editor-extensions-menu ...

  7. web安全入门课程笔记——网站基础与信息搜集

    2-1 网站的基本概念 URL统一资源定位符 这是一个动态页面 ?ID 查询条件 后台数据库最有可能:ACCESS Web容器(web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,而 ...

  8. Java并发编程(详解wait(), notify(),sleep())

    http://blog.csdn.net/luckyzhoustar/article/details/48179161

  9. Linux 第五章 学习笔记

    ---恢复内容开始--- 第五章 系统调用 一.与内核通信 1.系统调用在用户控件进程和硬件设备之间添加了一个中间层. 为用户空间提供了一种硬件的抽象接口 系统调用保证了系统的稳定和安全 每个进程都运 ...

  10. Eclipse导入包提示Setting build path has encountered a problem

    Eclipse无法导入jar包时, 提示:“Setting build path” has encountered a problem,Could not write file D:\\workspa ...