Python中关于List的remove方法的一些疑问

众所周知,列表的 remove()方法是用于移除列表中某个值的第一个匹配项的方法。 如果某个列表中的所有元素都是数字或字符串,那么 remove()方法就很好理解。 但是,如果列表中的元素都是类的对象呢? 我在编写某个项目时就遇到了这个困扰。 首先,我使用列表保存了一系列的不同的对象,然后我需要遍历所有的元素并筛选,得到一个新的列表。 于是我先对这个列表进行了潜复制,然后遍历原列表,进行筛选,满足条件的元素(对象)将从潜复制后的新列表中使用 remove()方法移除。

显然这不是最好的方法,我认为应该先生成一个空列表,然后将不满足条件的元素(对象)添加到这个新列表里。

虽然最终代码运行结果合乎我的预期,但我还是很困扰。 对于对象来说,list 的 remove()方法是如何判断它是否匹配的呢? 这个方法具体又是如何实现的呢? 如果我能阅读得到 Python 中有关 list 的源代码就好了。


Python中关于List的remove方法的一些疑问

5 回复

帖子回复:

list.remove(x) 这个方法确实有个坑:它只删掉第一个匹配到的值。如果你列表里有重复元素,想全删掉,直接循环调用 remove() 会出问题,因为删元素时列表长度变了,索引会乱。

比如这段代码就会漏删:

my_list = [1, 2, 3, 2, 4, 2]
for item in my_list:
    if item == 2:
        my_list.remove(item)
print(my_list)  # 输出 [1, 3, 4, 2]  ← 还有个2没删掉

正确做法:

  1. 列表推导式(最Pythonic):
my_list = [1, 2, 3, 2, 4, 2]
my_list = [x for x in my_list if x != 2]
print(my_list)  # 输出 [1, 3, 4]
  1. filter() 函数
my_list = [1, 2, 3, 2, 4, 2]
my_list = list(filter(lambda x: x != 2, my_list))
  1. 倒序循环删除(适合必须原地修改的情况):
my_list = [1, 2, 3, 2, 4, 2]
for i in range(len(my_list)-1, -1, -1):
    if my_list[i] == 2:
        del my_list[i]
print(my_list)  # 输出 [1, 3, 4]

总结:删重复值别直接循环,用列表推导式最稳。

话说平时碰到这些有趣的网址除了放入收藏夹,你们都是如何记住的呢?

回到顶部