2011-04-11 44 views
0

这是我的代码:从Python列表中删除每个值的某个值?

a = [1,2,3,43,43,43] 

count = a.count(43) 
if count > 0: 
    for i in range(count): 
     a.remove(43) 

print a 

有没有一种简单的方法来实现这一目标?

+1

这也不是一个很好的算法。每次你执行'a.remove(43)'时,Python都会从列表的开头再次开始,所以你一遍又一遍地测试值[1,2,3]。在大O标记中,这是O(n^2)。下面使用简单的列表理解的答案是O(n) – 2011-04-11 07:01:50

回答

8

尝试

a = [x for x in a if x != 43] 
3

尝试itertools

>>> import itertools 
>>> a = [1, 2, 3, 43, 43, 45] 
>>> iter = itertools.ifilter(lambda x: x != 43, a) 
>>> list(iter) 
[1, 2, 3] 
+0

通常,列表理解和生成器表达式更好。 – minhee 2011-04-11 06:36:08

+0

是的,我同意:) – 2011-04-11 06:37:04

+3

'itertools'是建立在标准生成器工具上的一组不错的工具。这是非常有用的,但我认为这个具体问题有点矫枉过正。 – 2011-04-11 06:39:03

1

是你只想删除列表中的所有a 43S什么?

a = [x for x in a if x != 43] 
+1

那里有小字谜吗?它不应该是'[x for a ...而不是'[a for a x in a ...']吗? – 2011-04-11 06:37:40

+0

是的,你是对的。我编辑过。 – minhee 2011-04-11 06:41:33

3

请注意,上述所有的解决方案(除了一个用删除,而是一个具有非线性执行时间)将创建一个新的列表,而不是修改原来的到位。这可能会或可能不会成为你的情况的问题。如果要修改原始列表,则必须使用切片分配,例如:

a[:] = [value for value in a if value != 43] 
+0

这里为什么需要分片分配? – 2011-04-11 22:07:04

+2

正如我在代码上面的注释中所说的那样,这是如果您想要修改原始列表。如果列表作为函数中的参数传递,并且您希望该函数具有修改调用程序所看到的列表的副作用,这可能很重要。 – 2011-04-12 12:40:59

+1

+1啊,好榜样! – 2011-04-13 05:44:05