2011-03-17 161 views
1

可能重复:
Removing an element from a list based on a predicate简单的方法来从列表中删除元素在Python

假如我有一个名单,我想从它的元素尊重的条件删除,,我怎么能实现这个更容易?

我试着用:

for i in range (len(list)):  
    if [condition]: 
     del(list[i]); 

显然,这是行不通的......在我心中唯一的办法就是做转移到左边来代替我要删除的元素,然后删除最后一个元素无论如何,有没有更快的解决方案?

+2

不要使用'list'作为变量名称。 – 2011-03-17 13:06:05

+0

根据索引从列表中删除项目时循环列表并不好。此外,我会避免命名你的列表变量'列表' – JoshAdel 2011-03-17 13:06:44

回答

0

如果您需要修改就地列表(所以其他人提出的建议filter或者列表理解都不会帮你)那么:

  1. 您可以避免通过以相反顺序处理元素而给出的代码彻底失败,以便删除一个不会影响稍后处理元素的编号。

  2. 转移元素以将“死”的元素放在最后几乎肯定不值得,但如果你这样做,你可以通过在最后删除所有死元素,而不是像你看到的那样去掉每一个元素。 (从中获得的收益很可能很小,删除列表中的最后一个元素是便宜的,除非它碰巧触发了实际的调整大小,这在设计上并不经常执行)。

  3. 如果发生这种情况你正在删除很多元素 - 列表中所有元素的很大一部分 - 然后上面2中的“不值得”不那么明显,你应该用两种方式进行基准测试。

4

最简单的方法是使用filter创建列表的副本:

list_removed = filter(lambda item: not condition(item), list) 
+0

当然你的意思是'lambda项目:不条件'? – 2011-03-17 13:11:43

+0

@Hugh:我确定。感谢捕捉,并修复。 – 2011-03-17 13:15:10

12

如何使用列表理解:

mylist = [x for x in mylist if not condition] 
+1

+1 for'not condition' – eumiro 2011-03-17 13:08:37

+0

谢谢!非常有帮助和简单 – shaku 2011-03-17 13:12:15

1

我推荐@ Space_C0wb0y的解决方案;然而,为了完整我想指出,

for i in range(len(lst)-1, -1, -1):  
    if (condition): 
     del lst[i] 

正常工作。

+1

它的工作原理是O(n^2),而列表理解或过滤器调用是O(n)。这可能并不总是重要的,但列表理解不可能永远是错误的选择。 – Duncan 2011-03-17 13:37:46

+0

@Duncan:不争论,但你怎么得到O(n ** 2)? – 2011-03-17 13:39:52

+3

我相信这是因为每次删除列表中的项目时,所有的结尾项目都会向下移动一个。看到这个答案的结尾是一个就地,保持顺序的过滤器(我想!)可以避免这个问题:http://stackoverflow.com/questions/5162991/list-manipulation-with-pop-python/5163010#作为@senderle,5163010 – senderle 2011-03-17 14:27:35

相关问题