删除list中元素的问题
来源:互联网 发布:技术员软件管家 编辑:程序博客网 时间:2024/06/05 20:29
先来看一个例子:
lst = [x for x in xrange(10)];print(lst)for x in lst: lst.remove(x)print(lst)结果为:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9][1, 3, 5, 7, 9] #为啥没有被删除干净呢?
查看python源代码:
Python-2.7.5\Objects\listobject.c 【python中list的实现代码】
remove方法对应的代码如下:
static PyObject *listremove(PyListObject *self, PyObject *v){ Py_ssize_t i; for (i = 0; i < Py_SIZE(self); i++) { int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ); if (cmp > 0) { if (<span style="background-color: rgb(51, 255, 51);">list_ass_slice(self, i, i+1,</span> <span style="color:#000000;background-color: rgb(51, 255, 51);">(PyObject *)NULL) == 0</span>) Py_RETURN_NONE; return NULL; } else if (cmp < 0) return NULL; } PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list"); return NULL;}
代码逻辑比较简单,先查找是否存在要被remove的元素,如果存在多个相同的值,只remove第一个被找到的元素。
找到之后,就调用list_ass_slice(self, i, i+1,(PyObject *)NULL) == 0
再看这个list_ass_slice函数中干了什么,如下片段:
if (d < 0) { /* Delete -d items */ memmove(&item[ihigh+d], &item[ihigh], (Py_SIZE(a) - ihigh)*sizeof(PyObject *)); list_resize(a, Py_SIZE(a) + d); item = a->ob_item; }
原来是将要被删除之后的所有元素向前移动。
这就能解释为啥开始的例子中,遍历remove后,仍然还有元素没有remove掉了。因为remove掉2之后,元素3跑到了2的位置,下一个被遍历的就变成4了。
PS:python的list本身就是一个指针数组:
typedef struct { PyObject_VAR_HEAD /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ PyObject **ob_item; /* ob_item contains space for 'allocated' elements. The number * currently in use is ob_size. * Invariants: * 0 <= ob_size <= allocated * len(list) == ob_size * ob_item == NULL implies ob_size == allocated == 0 * list.sort() temporarily sets allocated to -1 to detect mutations. * * Items must normally not be NULL, except during construction when * the list is not yet visible outside the function that builds it. */ Py_ssize_t allocated;} PyListObject;
总结:
1、如果要删除list中的所有元素,可以使用clear方法;
2、不建议删除list中的部分元素,因为需要移动被删除元素后面的所有元素,效率比较低;
可以将需要删除的元素置为None,后续处理时过滤掉None即可。
0 0
- 删除list中元素的问题
- list删除元素问题
- 删除list中元素
- 循环删除list中元素的方法
- 删除List中元素的正确姿势
- 遍历List删除元素问题
- 关于用集合的remove方法删除list集合中满足条件的元素问题
- JAVA中List删除元素部分陷阱问题
- java教程:java中经常用到的List元素删除问题
- STL 中list删除元素
- list容器中元素删除
- List遍历中删除元素
- 删除list中某些元素
- 关于List中删除元素
- JAVA中循环删除list中元素的方法总结
- JAVA中循环删除list中元素的方法总结
- python中对list遍历的过程中删除元素
- JAVA中循环删除list中元素的方法总结
- Ambient Occlusion(AO)
- [leetcode]Trapping Rain Water
- 黑马程序员——C语言学习总结11-21
- 图像上找线、圆
- C++中友元详解
- 删除list中元素的问题
- jsp中的JSTL与EL表达式用法
- Hudson error "Not enough storage is available to process this command."
- Linux只iptables
- centos5.6安装xen
- UILable添加超链接图片改变字体 NIAttributedLabel
- 移动互联网发展进入全民时代
- 关于List的一个小问题——remove()函数
- Cascaded Shadow Map(CSM)