场景:我想剔除列表中所有的空元素
我尝试过 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]
看了代码还不明白为何的同学,回去补列表推导相关内容。(以后会有一篇专门的文章讲各种推导式,跟大家一起学习)
你好ZKeeer,我看了你的代码,有如下几点建议,望斧正:
1. 数组越界其实不是问题,只要倒序pop即可;
2. 去重时我觉得用list的in()不妥,他是O(n)的复杂度,也就是说去重你用了O(n2)但内置的set()其实也就O(n),因为用了hash table。
多谢您的建议,关于数组越界,我想说的是在下面这种情况下,确实存在越界。文章一开始的两种方法都是一边遍历一边动态剔除,因为mylist的实际长度缩短了,但是range的值不变。
for index in range(len(mylist)):
if mylist[index] in mylist[index+1:-1]:
mylist.pop(index)
关于时间复杂度,一是考虑到应用场景很小,若是上万 千万 亿的数据,自然用高级的算法。
还有set你也说是hash了,那自然是无序的,跟我一开始的初衷就背离