慎用python的pop和remove方法

申明:转载请注明出处!!!

Python关于删除list中的某个元素,一般有两种方法,pop()和remove()。

如果删除单个元素,使用基本没有什么问题,具体如下。

1.pop()方法,传递的是待删除元素的index:

x = [‘a‘, ‘b‘, ‘c‘, ‘d‘]
x.pop(2)
print x

------------------
result:
[‘a‘, ‘b‘, ‘d‘]

  

2. remove()传递待删除元素,如果多个元素一样,默认删除第一个:

x = [‘a‘, ‘b‘, ‘a‘, ‘c‘, ‘d‘]
x.remove(‘a‘)
print x

-----------------
result:
[‘b‘, ‘a‘, ‘c‘, ‘d‘]

  

如果要循环删除符合某个条件的元素,慎用!!

x = [‘a‘, ‘b‘, ‘c‘, ‘d‘]
y = [‘b‘, ‘c‘]
for i in x:
	if i in y:
		x.remove(i)
print x

-----------------------
result:
[‘a‘, ‘c‘, ‘d‘]

  

x = [‘a‘, ‘b‘, ‘c‘, ‘d‘]
y = [‘b‘, ‘c‘]
for i in x:
	if i in y:
		idx = x.index(i)
		x.pop(idx)
print x

--------------
result:
[‘a‘, ‘c‘, ‘d‘]

  我认为出现这种情况的主要原因是,pop和remove方法属于‘破坏性操作‘(ps:原谅我自创的定义),x.remove()后,内存中原来存放x的位置已经释放,又重新申请了内存存放新的x。可以理解为x已经不是原来的x了,而for循环中传递的x还是原来x在内存中的位置,所以在x.remove(i)后,for循环找不到x了,后面的删除即无法完成。为了完成循环删除list元素的问题,我推荐用下面的方法。

x = [‘a‘, ‘b‘, ‘c‘, ‘d‘]
y = [‘b‘, ‘c‘]
x_new = []
for i in x:
	if i not in y:
		x_new.append(i)
x = x_new
print x

----------------------
result:
[‘a‘, ‘d‘]

  

时间: 2024-10-07 17:52:30

慎用python的pop和remove方法的相关文章

谈谈Python中pop与remove的用法

remove() 函数用于移除列表中某个值的第一个匹配项. remove()方法语法:  list.remove(obj) 如果obj不在列表中会引发 ValueError 错误,通常先使用count方法查看有多少个obj pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值. pop()方法语法:  list.pop(obj=list[-1]) 接下来发现网上的另一篇文章貌似说的不是很合理 https://www.jb51.net/article/132501.ht

Python List remove()方法-用于移除列表中某个值的第一个匹配项

描述 remove() 函数用于移除列表中某个值的第一个匹配项. 语法 remove()方法语法: list.remove(obj) 参数 obj -- 列表中要移除的对象. 返回值 该方法没有返回值但是会移除两种中的某个值的第一个匹配项. 实例 以下实例展示了 remove()函数的使用方法: #!/usr/bin/python aList = [123, 'xyz', 'zara', 'abc', 'xyz']; aList.remove('xyz'); print "List : &quo

Python中POP()的区别

Python中列表,字典和Set都有pop函数,但参数略有区别如下:以下参数基于Python 3.4.1 1. List 1 >>> help(list.pop) 2 Help on method_descriptor: 3 4 pop(...) 5 L.pop([index]) -> item -- remove and return item at index (default last). 6 Raises IndexError if list is empty or ind

学习python第四天——列表方法

1.append() 列表append()昨天说过用于在列表尾部添加元素 2.clear() 用于列表元素清除,释放内存 3.copy() 字面意思复制,拷贝分为浅拷贝和深拷贝,copy()方法属于列表深拷贝. 深拷贝和浅拷贝抄自其他网页: 浅拷贝 1.对于 不可 变类型 Number String Tuple,浅复制仅仅是地址指向,不会开辟新空间. 2.对于 可 变类型 List.Dictionary.Set,浅复制会开辟新的空间地址(仅仅是最顶层开辟了新的空间,里层的元素地址还是一样的),进

python中列表中的方法(重点) 列表的基本操作(赋值、删除和分片赋值)

第 7 课: 列表的基本操作(赋值.删除和分片赋值) # 列表的基本操作 # 赋值.删除列表元素.分片赋值 # 1. 列表元素的赋值 values = ["Bill", "Mary", "John"] values[0] = "Mike" values[1] = 10.4 values[-1] = "Joe" # values[-5] = "abc" # 抛出异常 print(value

python中pop()函数的用法

python中pop()函数的用法 pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值. 语法:list.pop(obj=list[-1]) //默认为 index=-1,删除最后一个列表值. obj -- 可选参数,要移除列表元素的对象. 该方法返回从列表中移除的元素对象. sentence=['All', 'good', 'things', 'come', 'to' ,'those', 'who', 'wait.'] print("默认为 index=-1,删除

python常用数据类型内置方法介绍

熟练掌握python常用数据类型内置方法是每个初学者必须具备的内功. 一.整型 a = 100 a.xxx() class int(object): def bit_length(self): ##如果将某个整数用2进制表示,返回这个2进制所占bit位数. return 0 def conjugate(self, *args, **kwargs): ##共轭复数 @classmethod # known case def from_bytes(cls, bytes, byteorder, *ar

C# Datatable删除行的Delete和Remove方法

delete和remove Delete的使用是 datatable.Rows[i].Delete(); Remove的使用是datatable.Rows.Remove(datatable.Rows[i]); 这两个的区别是,使用delete后,只是该行被标记为deleted,但是还存在,用Rows.Count来获取行数时,还是删除之前的行数.需要使用datatable.AcceptChanges()方法来提交修改. 而Remove方法则是直接删除. 如果在for循环里删除行的话,最好是使用de

python 的__del__删除器方法

遇到了python关于del的小问题,又引发了一些问题,就简单的记录下,如果有不同意见,欢迎一起讨论~ python类似java是有垃圾回收机制的语言,所以我们不需要像c++一样通过析构函数来手动释放内存, 但是python也同样提供了__del__释放方法.当一个对象的引用计数为0时,会被自动调用,那么先来说说 引用计数吧. 1.引用计数 #!/usr/bin/env python #coding:UTF-8 import sys class MyClass(object): def __in