浏览列表的所有对象并删除其中的一些对象

时间:2013-08-26 17:16:35

标签: python list

l是我想要探索的列表,以便取消某些项目。函数do.i.want.to.suppres.i返回TRUE或FALSE以告诉我是否需要抑制。这个功能的细节并不重要。

我试过了:

l = [1,4,2,3,5,3,5,2]
for i in l:
   if do.i.want.to.suppress.i(i):
      del i
print l

l不会改变!所以我试过

l = [1,4,2,3,5,3,5,2]
for position,i in enumerate(l):
   if do.i.want.to.suppress.i(i):
      del l[position]

但问题是该位置与对象i不匹配,因为l在循环期间被修改。

我可以这样做:

l = [1,4,2,3,5,3,5,2]
for position,i in enumerate(l):
   if do.i.want.to.suppress.i(i):
      l[position] = 'bulls'
l = [x for x in l if x!='bulls']

但我想应该有一个更聪明的解决方案。你有吗?

5 个答案:

答案 0 :(得分:5)

l = [item for item in my_list if not do_I_suppress(item)]

列出理解!学习它们!爱他们!住他们!

答案 1 :(得分:1)

列表理解方法是最pythonic方式,但如果你真的需要修改列表本身,那么我发现这是最好的方法,比while循环方法更好:

for position in xrange(len(l) - 1, -1, -1):        
    i = l[position]
    if do.i.want.to.suppress.i(i):
        del l[position]

答案 2 :(得分:0)

这是使用while循环的好地方

i = 0
while i < len(l):
  if do.i.want.to.suppress.i(i):
    del l[i]
  else:
    i = i + 1

答案 3 :(得分:0)

filter也可以使用:

answer = filter(lambda x: not do_I_suppress(x), lis)

请注意,在Python 3.x中,您需要将filter放入list

answer = list(filter(lambda x: not do_I_suppress(x), lis))

答案 4 :(得分:0)

除了List Comprehension(返回列表,在内存中创建完整列表):

filtered_list = [itm for itm in lst if i_want_to_keep(itm)]

您可以使用filter()(与列表理解相同的结果)

filtered_list = filter(i_want_to_keep, lst)

itertools.ifilter()(返回迭代器并避免在内存中创建整个列表,特别适用于迭代)

import itertools
filtered_list = itertools.ifilter(i_want_to_keep, lst)

for itm in filtered_list:
    do_whatever(itm)