python 剔除列表中的所有的某一元素

场景:我想剔除列表中所有的空元素

我尝试过 for index in rang(0, len(mylist))  + mylist.pop/remove ;或者是 for item in mylist + mylist.pop/remove, 都会因为失去元素导致数组越界问题,即便是使pop或者remove完了使index-=1,仍然会越界 或者删不干净。

方法如下,见代码:

mylist = []
copy_mylist = mylist
for item in copy_mylist:
    if item == "":
        mylist.remove(item)

方法二:

方法二同样适用于剔除列表中的相同元素,且保持原有序列。

my_list = [1, 2, 3, "", 5, "", 7, "", 10]
tmp_list = []
[tmp_list.append(item) for item in my_list if item]
my_list = tmp_list
print(my_list)

执行结果:

[1, 2, 3, 5, 7, 10]

再说说去重,本质上跟文章主题是一样的。也是剔除一些元素。

my_list = [1, 2, 3, 3, 5, 7, 7, 7, 10]
tmp_list = []
[tmp_list.append(item) for item in my_list if item not in tmp_list]
my_list = tmp_list
print(my_list)

执行结果:

[1, 2, 3, 5, 7, 10]

 

看了代码还不明白为何的同学,回去补列表推导相关内容。(以后会有一篇专门的文章讲各种推导式,跟大家一起学习)

2 thoughts on “python 剔除列表中的所有的某一元素”

  1. 你好ZKeeer,我看了你的代码,有如下几点建议,望斧正:

    1. 数组越界其实不是问题,只要倒序pop即可;
    2. 去重时我觉得用list的in()不妥,他是O(n)的复杂度,也就是说去重你用了O(n2)但内置的set()其实也就O(n),因为用了hash table。

    1. 多谢您的建议,关于数组越界,我想说的是在下面这种情况下,确实存在越界。文章一开始的两种方法都是一边遍历一边动态剔除,因为mylist的实际长度缩短了,但是range的值不变。

      for index in range(len(mylist)):
      if mylist[index] in mylist[index+1:-1]:
      mylist.pop(index)

      关于时间复杂度,一是考虑到应用场景很小,若是上万 千万 亿的数据,自然用高级的算法。
      还有set你也说是hash了,那自然是无序的,跟我一开始的初衷就背离

发表评论

电子邮件地址不会被公开。 必填项已用*标注