在Python remove()中将删除列表中第一次出现的值.
如何从列表中删除所有出现的值,而不对列表进行排序?
这就是我的想法.
>>> remove_values_from_list([1, 2, 3, 4, 2, 2, 3], 2)
[1, 3, 4, 3]
Run Code Online (Sandbox Code Playgroud)
Mar*_*off 461
功能方法:
2.X
>>> x = [1,2,3,2,2,2,3,4]
>>> filter(lambda a: a != 2, x)
[1, 3, 3, 4]
Run Code Online (Sandbox Code Playgroud)
3.X
>>> x = [1,2,3,2,2,2,3,4]
>>> list(filter((2).__ne__, x))
[1, 3, 3, 4]
Run Code Online (Sandbox Code Playgroud)
要么
>>> x = [1,2,3,2,2,2,3,4]
>>> list(filter(lambda a: a != 2, x))
[1, 3, 3, 4]
Run Code Online (Sandbox Code Playgroud)
mha*_*wke 194
您可以使用列表理解:
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]
Run Code Online (Sandbox Code Playgroud)
A. *_*ady 102
如果必须修改原始列表,则仍可以使用切片分配,同时仍使用有效的列表推导(或生成器表达式).
>>> x = [1, 2, 3, 4, 2, 2, 3]
>>> x[:] = (value for value in x if value != 2)
>>> x
[1, 3, 4, 3]
Run Code Online (Sandbox Code Playgroud)
fun*_*unk 39
以更抽象的方式重复第一篇文章的解决方案:
>>> x = [1, 2, 3, 4, 2, 2, 3]
>>> while 2 in x: x.remove(2)
>>> x
[1, 3, 4, 3]
Run Code Online (Sandbox Code Playgroud)
Sha*_*eem 16
查看简单解决
方案解决方案1:
>>> [i for i in x if i != 2]
Run Code Online (Sandbox Code Playgroud)
这将返回一个列表,其中包含x没有2
解决方案2的所有元素:
>>> while 2 in x : x.remove(2)
Run Code Online (Sandbox Code Playgroud)
Pau*_*l S 10
上面的所有答案(除了Martin Andersson)都会创建一个没有所需项目的新列表,而不是从原始列表中删除项目.
>>> 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
Run Code Online (Sandbox Code Playgroud)
如果您对列表有其他引用,这可能很重要.
要修改列表,请使用这样的方法
>>> 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
Run Code Online (Sandbox Code Playgroud)
就速度而言,我的笔记本电脑上的结果是(所有5000个条目列表中删除了1000个条目)
所以.remove循环慢了大约100倍........嗯,也许需要一种不同的方法.我发现最快的是使用列表推导,但随后替换原始列表的内容.
>>> def removeall_replace(x, l):
.... t = [y for y in l if y != x]
.... del l[:]
.... l.extend(t)
Run Code Online (Sandbox Code Playgroud)
以可读性为代价,我认为这个版本稍微快一些,因为它不会强制重新检查列表,因此无论如何都要执行完全相同的工作删除:
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)
Run Code Online (Sandbox Code Playgroud)
你可以这样做
while 2 in x:
x.remove(2)
Run Code Online (Sandbox Code Playgroud)
要删除所有重复的事件并在列表中留下一个:
test = [1, 1, 2, 3]
newlist = list(set(test))
print newlist
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
这是我用于 Project Euler 的函数:
def removeOccurrences(e):
return list(set(e))
Run Code Online (Sandbox Code Playgroud)
针对具有 1.000.000 个元素的列表/数组的 Numpy 方法和计时:
时间:
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
Run Code Online (Sandbox Code Playgroud)
结论:与列表理解方法相比,numpy 快 27 倍(在我的笔记本上)
PS,如果您想将常规 Python 列表转换lst为 numpy 数组:
arr = np.array(lst)
Run Code Online (Sandbox Code Playgroud)
设置:
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
Run Code Online (Sandbox Code Playgroud)
查看:
In [14]: a[a != 2].shape
Out[14]: (998949,)
In [15]: len([x for x in lst if x != 2])
Out[15]: 998949
Run Code Online (Sandbox Code Playgroud)
a = [1, 2, 2, 3, 1]
to_remove = 1
a = [i for i in a if i != to_remove]
print(a)
Run Code Online (Sandbox Code Playgroud)
也许不是最pythonic但对我来说仍然是最简单的哈哈