python list有关remove的问题
在python 中进行一次简单的列表循环,当用到remove时出现了一个很有趣的现象,
代码如下:
a=range(30)
for i in a :
if i%4!=0:
a.remove(i)
这段代码是在a里取i 当i不能够整除4 的时候,a就在自己里面删除这个时候的i 值,最后输出的a的结果应该是[0,4,8,12,16,20,24,28],结果真的是这样吗?
a=range(30)
for i in a :
if i%4!=0:
a.remove(i) a
[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传到下面什么值,它就会删除什么值。
那么怎么该解决这样的问题呢??下面我列出了几种解决的办法,当然方法也不限于这几种,代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Time : 2017-06-25 18:04
# Author : MrFiona
# File : summary_func.py
# Software: PyCharm Community Edition import time # TODO 4、list的remove的多次操作 # TODO 第一种处理方法
def list_remove_func_1():
test_remove = [652, 34, 652, 652, 418, 0, 440, 220, 652, 49, 336, 493, 510, 255, 652, 652, [1, 2], 652, 652]
# TODO 用来标记移除的满足条件的数据的个数
remove_num = 0
for index in range(len(test_remove) + 1):
if remove_num:
# TODO 因为移除remove_num了个数据,所以test_remove数据已经减少了相应数量
index -= (remove_num)
try:
# print 'index:\t', index, test_remove[index]
if 652 == test_remove[index]:
n = test_remove[index]
test_remove.remove(n)
remove_num += 1
# print 'remove index [ %d ]\tvalue: [ %d ]' % (index, test_remove[index])
# TODO 因为循环次数开始已经确定为len(test_remove),随着不断的移除数据,test_remove长度在减少,所以当捕捉到
# TODO 的IndexError的时候处理已经完成
except IndexError:
print test_remove # TODO 第二种处理方法
def list_remove_func_2():
test_remove = [652, 34, 652, 652, 418, 0, 440, 220, 652, 49, 336, 493, 510, 255, 652, 652, [1, 2], 652, 652]
# TODO 使用列表表达式来完成,速度增加了五六倍
test_remove = [ ele for ele in test_remove if ele != 652 ]
# TODO 改成元祖表达式又会比列表表达式快两倍
test_remove = ( ele for ele in test_remove if ele != 652 )
print test_remove # TODO 第三种处理方法
def list_remove_func_3():
test_remove = [652, 34, 652, 652, 418, 0, 440, 220, 652, 49, 336, 493, 510, 255, 652, 652, [1, 2], 652, 652]
# TODO 移动次数比正常的移动次数相等,因为是在不停的检测是否还有待移除的数据,有酒移除第一个被发现的符合的数据,否则ValueError退出
time_count = 0
try:
while 1:
test_remove.remove(652)
time_count += 1
except ValueError:
pass
print time_count """
TODO Summary:
以移除列表1000000次为准以下几种方法所耗时间对比:
1、list_remove_func_2中用元祖来处理:1.5452-----最快的方法
2、list_remove_func_2中用列表来处理:3.2566-----仅次于元祖的方法
3、list_remove_func_3方法:5.6115-----比较慢的方法
4、list_remove_func_1方法:12.6582-----最慢的方法
"""
python list有关remove的问题的更多相关文章
- Python列表的remove方法的注意事项
为何没有删除列表中的全部元素? 解释: 按照执行顺序,第一个空格被删除之后,后面的元素会前移(变成['空格','空格','12','23']),指针下一次会指向新列表的第二个元素(即初始状态的第三个空 ...
- python list 中 remove 的骚操作/易错点
在过去的某一天(2019.3.19),有个学弟问了一个关于python list中的一个问题: 比如我们已知一个列表 [3,4,5,6,5,4,3] 我们想删除第一个为3的元素. 我们尝试了如下几种方 ...
- python 集合set remove update add
1. 集合(set):把不同的元素组成一起形成集合,是python基本的数据类型. 集合对象是一组无序排列hashable value:集合成员可以做字典的键. 集合就像是 list 和 dict 的 ...
- Python list遍历remove()时的一个小BUG
有这样一个列表: s=list('abcdefg') 现在因为某种原因我们需要从s中踢出一些不需要的元素,方便起见这里直接以踢出所有元素的循环代替: for e in s: s.remove(e) 结 ...
- python中的remove趣谈
首先我们要知道remove做的操作是顺序遍历list表,找到第一个匹配的项时删掉该项,并不会再往下找,那我们看下面的代码 mylist = [1,2,3] for i in mylist: print ...
- [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 ...
- python中的remove
remove()从左到右寻找,移除找到的第一个指定元素,举个例子: 1 a = ["hello", "world", "world", &q ...
- python列表删除--remove(),del,pop()
remove()参数为列表元素,若在列表中,删除,不在则报错 如: pop()不带参数时默认删除列表的末尾元素并返回该元素,带参数时该参数为列表元素的下标值 不带参数: 以下标为参数: del 后面可 ...
- 【leetcode❤python】 203. Remove Linked List Elements
#-*- coding: UTF-8 -*- # Definition for singly-linked list.# class ListNode(object):# def __init ...
随机推荐
- Struts2之Action接收请求参数和拦截器
技术分析之在Struts2框架中使用Servlet的API 1. 在Action类中也可以获取到Servlet一些常用的API * 需求:提供JSP的表单页面的数据,在Ac ...
- Java学习笔记——设计模式之四.代理模式
To be, or not to be: that is the question. --<哈姆雷特> 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. 上代码: p ...
- python 分片
有些书中叫做分片,有些书中叫做切片,翻译时的一些误差) 概念:将序列按段进行切割 作用:通过分片操作符来访问一定范围内的元素 实现:分片是通过两个冒号相隔的索引来实现 范围:符合序列特性即可使用切片功 ...
- 对类对象使用new时地址分配的情况
我们知道,string类内部的构造函数是采用new来分配地址的.当创建对象时,会调用string的构造函数,从而实质上也使用了new.那么问题来了,如果我用new再创建一个string类型的指针呢?下 ...
- 贴片晶振跟随WIFI渗透到我们的生活之中
在用WIFI上网的时候很多时候会遇到上网速度不是慢就是卡,甚至是连接不上更气人的就是有时候会识别不了.我最常遇到的就是连接不上去,玩着玩着就玩不了了.起初我不知道这是什么原因,但是从事晶振行业之后我慢 ...
- Log4net日志记录、详细配置(自己使用)
[来自百度百科的一句介绍]log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具. 1.首先添 ...
- 关于RFID2.4G 标签卡最新方案
它是一款针对RFID有源卡行业设计的,是一款单向的2.4G频段RF射频芯片,目前主要针对低功耗的校讯通, 2.4G停车场,电动车防盗, 闪光灯设备(引闪器) ,智能家居等领域.SI24R2E 同样与S ...
- R语言的高质量图形渲染库Cairo(转)
前言 R语言不仅在统计分析,数据挖掘领域,计算能力强大.在数据可视化上,也不逊于昂贵的商业.当然,背后离不开各种开源软件包的支持,Cairo就是这样一个用于矢量图形处理的类库. Cairo可以创建高质 ...
- The dplyr package has been updated with new data manipulation commands for filters, joins and set operations.(转)
dplyr 0.4.0 January 9, 2015 in Uncategorized I’m very pleased to announce that dplyr 0.4.0 is now av ...
- html或者php中 input框限制只能输入正整数,逻辑与和或运算
有时需要限制文本框输入内容的类型,本节分享下正则表达式限制文本框只能输入数字.小数点.英文字母.汉字等代码. 例如,输入大于0的正整数 代码如下: <input onkeyup="if ...