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 ...
随机推荐
- 1019 Least Common Multiple
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- SDN学习之RYU源码安装
近些天开始接触SDN,即软件定义网络的学习,由于是初学者,想通过写博客来分享自己对sdn学习中所使用的ryu以及mininet仿真软件. Mininet源码安装: 尽管网上对mininet的安装教程很 ...
- Java AOP (2) runtime weaving 【Java 切面编程 (2) 运行时织入】
接上一篇 Java AOP (1) compile time weaving [Java 切面编程 (1) 编译期织入] Dynamic proxy 动态代理 Befor talking abou ...
- vue视频学习笔记02
video 2 vue制作weibo交互 vue-> 1.0vue-resource ajax php服务器环境(node) this.$http.get()/post()/jsonp() th ...
- [刷题]算法竞赛入门经典(第2版) 4-9/UVa1591 - Data Mining
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) #include<iostream> unsigned N, A, ...
- 集群/分布式环境下5种session处理策略
转载自:http://blog.csdn.net/u010028869/article/details/50773174?ref=myread 前言 在搭建完集群环境后,不得不考虑的一个问题就是用户访 ...
- apply/call/bind和this的使用
fun.apply(context,[argsArray]) 立即调用fun,同时将fun函数原来的this指向传入的新context对象,实现同一个方法在不同对象上重复使用. context:传入的 ...
- (原创)foef注意事项
原创内容,转载请标明原文地址 我们先来看下下面的代码 //获取文件大小 DWORD Get_File_Size(const char* m_FilePath) { unsigned long size ...
- 微信第三方登录(原生)demo
在一家ecstore二开公司有一段时间了,公司希望往自己研发产品上面走,一直在培养新人. 最近要自己去微信登录,自己就在ectore的框架基础上,写的原生微信第三方登录以此来熟悉微信第三方登录,在 ...
- 忘记block格式 xib加载没有计算导航栏和tabbar的大小
敲inlineBlock xib加载没有计算导航栏和tabbar的大小 /将这个属性改为no self.tabBarController.tabBar.translucent = NO; 判断优化,两 ...