从列表中删除所有出现的值?
在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