Python:迭代列表时删除列表元素

我遍历Python中的元素列表,对它做一些操作,然后在符合特定条件时将其删除。

for element in somelist: do_action(element) if check(element): remove_element_from_list 

我应该用什么来代替remove_element? 我已经看到了类似的问题,但注意到所有元素都要执行的do_action部分的存在,从而消除了使用filter的解决scheme。

你总是可以迭代列表的副本,让你自由修改原来的:

 for item in list(somelist): ... somelist.remove(item) 

为了符合这些标准:原位修改原始列表,没有列表副本,只有一个通行证, 工作 ,传统的解决scheme是向后迭代:

 for i in xrange(len(somelist) - 1, -1, -1): element = somelist[i] do_action(element) if check(element): del somelist[i] 

奖金:每次迭代都不会执行len(somelist) 。 适用于任何版本的Python(至less早在1.5.2)… s / xrange / range / for 3.X.

更新:如果你想迭代,这是可能的,只是更棘手和丑陋的:

 i = 0 n = len(somelist) while i < n: element = somelist[i] do_action(element) if check(element): del somelist[i] n = n - 1 else: i = i + 1 

列表comp:

 results = [x for x in (do_action(element) for element in somelist) if check(element)] 

你仍然可以使用filter,移动到外部函数的元素修改(只重复一次)

 def do_the_magic(x): do_action(x) return check(x) # you can get a different filtered list filter(do_the_magic,yourList) # or have it modified in place (as suggested by Steven Rumbalski, see comment) yourList[:] = itertools.ifilter(do_the_magic, yourList) 
 for element in somelist: do_action(element) somelist[:] = (x for x in somelist if not check(x)) 

如果你真的需要一次完成而不复制列表

 i=0 while i < len(somelist): element = somelist[i] do_action(element) if check(element): del somelist[i] else: i+=1 

另一种方式是:

 while i<len(your_list): if #condition : del your_list[i] else: i+=1 

因此,您在检查时并排删除元素

你可以使一个生成器返回所有不被删除的东西:

 def newlist(somelist): for element in somelist: do_action(element) if not check(element): yield element 

为什么不重写它

 for element in somelist: do_action(element) if check(element): remove_element_from_list 

看到这个问题如何从列表中删除,虽然看起来像你已经看到, 迭代时从列表中删除项目

另一个select是,如果你真的想保持这一点,这样做

 newlist = [] for element in somelist: do_action(element) if not check(element): newlst.append(element) 

不完全是在原地,但有一些想法做到这一点:

 a = ['a', 'b'] def inplace(a): c = [] while len(a) > 0: e = a.pop(0) if e == 'b': c.append(e) a.extend(c) 

您可以扩展该function来调用您在条件中的过滤条件。