从列表中删除所有出现的值?

在Python中, remove()将删除列表中第一次出现的值。

如何从列表中删除所有出现的值,而不对列表进行sorting?

这是我的想法。

 >>> x = [1, 2, 3, 4, 2, 2, 3] >>> def remove_values_from_list(the_list, val): while val in the_list: the_list.remove(val) >>> remove_values_from_list(x, 2) >>> x [1, 3, 4, 3] 

function方法:

2.X

 >>> x = [1,2,3,2,2,2,3,4] >>> filter(lambda a: a != 2, x) [1, 3, 3, 4] 

3.X

 >>> x = [1,2,3,2,2,2,3,4] >>> list(filter((2).__ne__, x)) [1, 3, 3, 4] 

要么

 >>> x = [1,2,3,2,2,2,3,4] >>> list(filter(lambda a: a != 2, x)) [1, 3, 3, 4] 

你可以使用列表理解:

 def remove_values_from_list(the_list, val): return [value for value in the_list if value != val] x = [1, 2, 3, 4, 2, 2, 3] x = remove_values_from_list(x, 2) print x # [1, 3, 4, 3] 

如果原始列表必须修改,可以使用切片分配,同时仍然使用有效的列表理解(或生成器expression式)。

 >>> x = [1, 2, 3, 4, 2, 2, 3] >>> x[:] = (value for value in x if value != 2) >>> x [1, 3, 4, 3] 

以更抽象的方式重复第一篇文章的解决scheme:

 >>> x = [1, 2, 3, 4, 2, 2, 3] >>> while 2 in x: x.remove(2) >>> x [1, 3, 4, 3] 

除了Martin Andersson之外,上述所有答案都会创build一个没有所需项目的新列表,而不是从原始列表中删除项目。

 >>> import random, timeit >>> a = list(range(5)) * 1000 >>> random.shuffle(a) >>> b = a >>> print(b is a) True >>> b = [x for x in b if x != 0] >>> print(b is a) False >>> b.count(0) 0 >>> a.count(0) 1000 >>> b = a >>> b = filter(lambda a: a != 2, x) >>> print(b is a) False 

如果你有其他的引用挂在列表上,这可能是重要的。

要修改列表,请使用类似这样的方法

 >>> def removeall_inplace(x, l): ... for _ in xrange(l.count(x)): ... l.remove(x) ... >>> removeall_inplace(0, b) >>> b is a True >>> a.count(0) 0 

就速度而言,笔记本电脑上的结果(全部在5000个条目列表中,1000个条目被删除)

  • 列表理解 – 〜400us
  • filter – 〜900us
  • .remove()循环 – 50ms

所以.remove循环慢100倍左右……..嗯,也许需要一个不同的方法。 我发现最快的是使用列表理解,但是replace原始列表的内容。

 >>> def removeall_replace(x, l): .... t = [y for y in l if y != x] .... del l[:] .... l.extend(t) 
  • removeall_replace() – 450us

看简单的解决scheme

解决scheme1:

 >>> [i for i in x if i != 2] 

这将返回一个包含x所有元素而不是2的列表

解决scheme2:

 >>> while 2 in x : x.remove(2) 

你可以这样做

 while 2 in x: x.remove(2) 

以可读性为代价,我认为这个版本稍微快一点,因为它不会强制重新检查列表,因此完成删除必须做的完全相同的工作:

 x = [1, 2, 3, 4, 2, 2, 3] def remove_values_from_list(the_list, val): for i in range(the_list.count(val)): the_list.remove(val) remove_values_from_list(x, 2) print(x) 

要删除所有重复的事件,并在列表中留下一个:

 test = [1, 1, 2, 3] newlist = list(set(test)) print newlist [1, 2, 3] 

这里是我用于Project Euler的函数:

 def removeOccurrences(e): return list(set(e)) 

我相信这可能比任何其他方式更快如果你不关心列表顺序,如果你确实关心最后的订单存储从原来的索引和度假村。

 category_ids.sort() ones_last_index = category_ids.count('1') del category_ids[0:ones_last_index] 

从Python列表中删除所有出现的值

 lists = [6.9,7,8.9,3,5,4.9,1,2.9,7,9,12.9,10.9,11,7] def remove_values_from_list(): for list in lists: if(list!=7): print(list) remove_values_from_list() 

“”“结果:6.9 8.9 3 5 4.9 1 2.9 9 12.9 10.9 11”“”

或者,

 lists = [6.9,7,8.9,3,5,4.9,1,2.9,7,9,12.9,10.9,11,7] def remove_values_from_list(remove): for list in lists: if(list!=remove): print(list) remove_values_from_list(7) 

“”“结果:6.9 8.9 3 5 4.9 1 2.9 9 12.9 10.9 11”“”

Numpy的方法和时间与1.000.000元素的列表/数组:

时序:

 In [10]: a.shape Out[10]: (1000000,) In [13]: len(lst) Out[13]: 1000000 In [18]: %timeit a[a != 2] 100 loops, best of 3: 2.94 ms per loop In [19]: %timeit [x for x in lst if x != 2] 10 loops, best of 3: 79.7 ms per loop 

结论:与清单理解方法相比,numpy快了27倍(在我的笔记本上)

PS如果你想将常规Python列表lst转换为numpy数组:

 arr = np.array(lst) 

build立:

 import numpy as np a = np.random.randint(0, 1000, 10**6) In [10]: a.shape Out[10]: (1000000,) In [12]: lst = a.tolist() In [13]: len(lst) Out[13]: 1000000 

检查:

 In [14]: a[a != 2].shape Out[14]: (998949,) In [15]: len([x for x in lst if x != 2]) Out[15]: 998949 
 for i in range(a.count(' ')): a.remove(' ') 

我相信更简单。

关于速度!

 import time s_time = time.time() print 'start' a = range(100000000) del a[:] print 'finished in %0.2f' % (time.time() - s_time) # start # finished in 3.25 s_time = time.time() print 'start' a = range(100000000) a = [] print 'finished in %0.2f' % (time.time() - s_time) # start # finished in 2.11 
 p=[2,3,4,4,4] p.clear() print(p) [] 

只用Python 3