在python 中进行一次简单的列表循环,当用到remove时出现了一个很有趣的现象,

代码如下:

  1. a=range(30)
  2. for i in a :
  3. if i%4!=0:
  4. a.remove(i)

这段代码是在a里取i 当i不能够整除4 的时候,a就在自己里面删除这个时候的i 值,最后输出的a的结果应该是[0,4,8,12,16,20,24,28],结果真的是这样吗?

  1. a=range(30)
  2. for i in a :
  3. if i%4!=0:
  4. a.remove(i)
  5.  
  6. a
  7. [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28]

这个时候出现的结果完全不一样,2,6,10这些根本不对,那么为什么啊?那么这里就得说一下for in和remove了,

For in 是对下标进行操作,而remove是对值进行操作

当你执行第一个的时候,a 里面的第一个数是0 现在不符合规则,然后跳过,进行下一个循环,第二个数是1, 符合规则,把a里的1删除,现在a的表成了

[0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]然该第二个了,因为for in是按照下标取值的,那么第二个就成了3而不是2,这个时候就会把2跳过,以后的类似,而remove是对值进行操作,那么你i传到下面什么值,它就会删除什么值。

那么怎么该解决这样的问题呢??下面我列出了几种解决的办法,当然方法也不限于这几种,代码如下:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # Time : 2017-06-25 18:04
  4. # Author : MrFiona
  5. # File : summary_func.py
  6. # Software: PyCharm Community Edition
  7.  
  8. import time
  9.  
  10. # TODO 4、list的remove的多次操作
  11.  
  12. # TODO 第一种处理方法
  13. def list_remove_func_1():
  14. test_remove = [652, 34, 652, 652, 418, 0, 440, 220, 652, 49, 336, 493, 510, 255, 652, 652, [1, 2], 652, 652]
  15. # TODO 用来标记移除的满足条件的数据的个数
  16. remove_num = 0
  17. for index in range(len(test_remove) + 1):
  18. if remove_num:
  19. # TODO 因为移除remove_num了个数据,所以test_remove数据已经减少了相应数量
  20. index -= (remove_num)
  21. try:
  22. # print 'index:\t', index, test_remove[index]
  23. if 652 == test_remove[index]:
  24. n = test_remove[index]
  25. test_remove.remove(n)
  26. remove_num += 1
  27. # print 'remove index [ %d ]\tvalue: [ %d ]' % (index, test_remove[index])
  28. # TODO 因为循环次数开始已经确定为len(test_remove),随着不断的移除数据,test_remove长度在减少,所以当捕捉到
  29. # TODO 的IndexError的时候处理已经完成
  30. except IndexError:
  31. print test_remove
  32.  
  33. # TODO 第二种处理方法
  34. def list_remove_func_2():
  35. test_remove = [652, 34, 652, 652, 418, 0, 440, 220, 652, 49, 336, 493, 510, 255, 652, 652, [1, 2], 652, 652]
  36. # TODO 使用列表表达式来完成,速度增加了五六倍
  37. test_remove = [ ele for ele in test_remove if ele != 652 ]
  38. # TODO 改成元祖表达式又会比列表表达式快两倍
  39. test_remove = ( ele for ele in test_remove if ele != 652 )
  40. print test_remove
  41.  
  42. # TODO 第三种处理方法
  43. def list_remove_func_3():
  44. test_remove = [652, 34, 652, 652, 418, 0, 440, 220, 652, 49, 336, 493, 510, 255, 652, 652, [1, 2], 652, 652]
  45. # TODO 移动次数比正常的移动次数相等,因为是在不停的检测是否还有待移除的数据,有酒移除第一个被发现的符合的数据,否则ValueError退出
  46. time_count = 0
  47. try:
  48. while 1:
  49. test_remove.remove(652)
  50. time_count += 1
  51. except ValueError:
  52. pass
  53. print time_count
  54.  
  55. """
  56. TODO Summary:
  57. 以移除列表1000000次为准以下几种方法所耗时间对比:
  58. 1、list_remove_func_2中用元祖来处理:1.5452-----最快的方法
  59. 2、list_remove_func_2中用列表来处理:3.2566-----仅次于元祖的方法
  60. 3、list_remove_func_3方法:5.6115-----比较慢的方法
  61. 4、list_remove_func_1方法:12.6582-----最慢的方法
  62. """

python list有关remove的问题的更多相关文章

  1. Python列表的remove方法的注意事项

    为何没有删除列表中的全部元素? 解释: 按照执行顺序,第一个空格被删除之后,后面的元素会前移(变成['空格','空格','12','23']),指针下一次会指向新列表的第二个元素(即初始状态的第三个空 ...

  2. python list 中 remove 的骚操作/易错点

    在过去的某一天(2019.3.19),有个学弟问了一个关于python list中的一个问题: 比如我们已知一个列表 [3,4,5,6,5,4,3] 我们想删除第一个为3的元素. 我们尝试了如下几种方 ...

  3. python 集合set remove update add

    1. 集合(set):把不同的元素组成一起形成集合,是python基本的数据类型. 集合对象是一组无序排列hashable value:集合成员可以做字典的键. 集合就像是 list 和 dict 的 ...

  4. Python list遍历remove()时的一个小BUG

    有这样一个列表: s=list('abcdefg') 现在因为某种原因我们需要从s中踢出一些不需要的元素,方便起见这里直接以踢出所有元素的循环代替: for e in s: s.remove(e) 结 ...

  5. python中的remove趣谈

    首先我们要知道remove做的操作是顺序遍历list表,找到第一个匹配的项时删掉该项,并不会再往下找,那我们看下面的代码 mylist = [1,2,3] for i in mylist: print ...

  6. [LeetCode&Python] Problem 27. Remove Element

    Given an array nums and a value val, remove all instances of that value in-placeand return the new l ...

  7. python中的remove

    remove()从左到右寻找,移除找到的第一个指定元素,举个例子: 1 a = ["hello", "world", "world", &q ...

  8. python列表删除--remove(),del,pop()

    remove()参数为列表元素,若在列表中,删除,不在则报错 如: pop()不带参数时默认删除列表的末尾元素并返回该元素,带参数时该参数为列表元素的下标值 不带参数: 以下标为参数: del 后面可 ...

  9. 【leetcode❤python】 203. Remove Linked List Elements

    #-*- coding: UTF-8 -*- # Definition for singly-linked list.# class ListNode(object):#     def __init ...

随机推荐

  1. Linux下的Jenkins+Tomcat+Maven+Gitlab+Shell环境的搭建使用(jenkins自动化部署)

    jenkins自动化部署 目标:jenkins上点构建(也可以自动检查代码变化自动构建)>>>项目部署完成. 一.安装jenkins 1.下载jenkins 这里我选择的是war包安 ...

  2. 2017最新最稳定的合买彩票源码asp+sql2008 新增PK式彩种+全新界面

    下载地址: http://115.238.250.104:81/cnzz_code/2016-05/04/klcphm_v2016.rar 网站后台管理系统:新闻资讯系统 用户管理系统用户登录日志彩种 ...

  3. Vbs脚本实现radmin终极后门

    Vbs脚本实现radmin终极后门 代码如下: on error resume next const HKEY_LOCAL_MACHINE = &H80000002 strComputer = ...

  4. Oracle 12C 新特性之move (非分区表)table online

    以前版本中move table不能够online, move 会引rowid改变使对应的索引失效. 12c 中 alter table move online不会对新事务阻塞同时会自动的维护索引的有效 ...

  5. 调停者(Mediator)模式

    调停者模式是对象的行为模式.调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用.从而使它们可以较松散地耦合.当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些 ...

  6. JAVA的节点流和处理流

    节点流:可以从或向一个特定的地方(节点)读写数据.如FileReader. 处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写.如BufferedReader.处理流的构造方 ...

  7. List的多维度排序案例演示~

    文章也已同步到我的csdn:http://blog.csdn.net/u012881584/article/details/72377510 关于List的多维度排序. 日常工作中有很多关于list的 ...

  8. 纯css实现多标签浮动居中(任意个数)

    在做的一个网页上有一块要用浮动标签,具体就是网页底部有未知数量,未知尺寸的元素要水平居中,有点类似于分页器. 首先,我们先新建一个容器con,就是标签的爸爸,用来控制标签在页面的位置,.father{ ...

  9. Spring+SpringMVC+MyBatis深入学习及搭建(四)——MyBatis输入映射与输出映射

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6878529.html 前面有讲到Spring+SpringMVC+MyBatis深入学习及搭建(三)——My ...

  10. javascript基础-HTML5

    跨文档消息(Web Messaging cross-document messaging) 原理 往有关联(同一框架/弹出)的文档传递数据. Message Channel在javascript基础- ...