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

Python 浏览列表中的所有对象并删除其中一些对象,python,list,Python,List,l是一个列表,我想查看它以抑制某些项目。函数do.i.want.to.suppress.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):

l
是一个列表,我想查看它以抑制某些项目。函数
do.i.want.to.suppress.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']

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

这是一个使用while循环的好地方

i = 0
while i < len(l):
  if do.i.want.to.suppress.i(i):
    del l[i]
  else:
    i = i + 1
i=0
而我
这是使用while循环的好地方

i = 0
while i < len(l):
  if do.i.want.to.suppress.i(i):
    del l[i]
  else:
    i = i + 1
i=0
而我
列出理解!学习它们!爱他们!活下去


列出理解!学习它们!爱他们!活下去

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

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

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

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

过滤器
也可以工作:

answer = filter(lambda x: not do_I_suppress(x), lis)
注意,在Python3.x中,需要将
过滤器
放入
列表中

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

过滤器
也可以工作:

answer = filter(lambda x: not do_I_suppress(x), lis)
注意,在Python3.x中,需要将
过滤器
放入
列表中

answer = list(filter(lambda x: not do_I_suppress(x), lis))
此外(返回列表,在内存中创建完整列表):

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

或者(返回迭代器并避免在内存中创建整个列表,这对于迭代特别有用)

此外(返回列表,在内存中创建完整列表):

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

或者(返回迭代器并避免在内存中创建整个列表,这对于迭代特别有用)


好吧,对不起!谢谢大家的回答,对不起!感谢大家的回答-1因为与列表理解方法相比,这种方法有比0更糟糕的好处:这会创建一个函数并在每个元素上调用它,这要慢得多。列表理解只是进行函数式编程的一种更好的语法方式anyway@Claudiu“这将在每个元素上创建一个函数调用”,与列表理解完全相同。从
filter()
文档中:
注意,filter(函数,iterable)等同于[iterable中的item for item if function(item)]
。我同意列表理解更具可读性(只是因为他使用
lambda
来否定
do\u I\u suppress
),但他的答案仍然有效。@KurzedMetal:不是“在每个元素上创建函数调用”,而是“在每个元素上创建函数并调用它”。
filter
创建一个
lambda
,然后调用lambda。清单上没有
python-mtimeit“[x代表x范围(100),如果x%2==0]”
给出
10000个循环,每个循环3:18.5usec的最佳值
python-mtimeit”过滤器(lambda x:x%2==0,xrange(100))”
给出
10000个循环,每个循环3:31.4usec的最佳值
,这要慢得多。@Claudiu该示例应该已经定义了一个列表和一个函数,当然,生成没有不需要的项的列表要比创建列表然后删除这些项快得多
py-m timeit“def is_偶数(x):如果x%2==0,则返回True;如果x=0,则返回True;如果x=0,则返回True;如果x=0,则返回True;如果x=0,则返回True;如果x=0,则返回True;如果x=0,则返回True;如果x=0,则返回True;如果x=0,则返回True;如果x=0,则返回True;如果x=0,则返回True,则返回10000000个循环,最佳3:0.14每循环使用次数
@KurzedMetal:如果使用
xrange
range
,我的示例是相同的。问题是,使用
过滤器
,您必须声明一个函数,但使用此列表理解,您不需要声明函数。如果不声明函数,速度会更快。这里的iCodez示例不必要地声明了一个函数-1因为与列表理解方法相比,这种方法的好处比0差:这会创建一个函数并在每个元素上调用它,这要慢得多。列表理解只是进行函数式编程的一种更好的语法方式anyway@Claudiu“这将在每个元素上创建一个函数调用”,与列表理解完全相同。从
filter()
文档中:
注意,filter(函数,iterable)等同于[iterable中的item for item if function(item)]
。我同意列表理解更具可读性(只是因为他使用
lambda
来否定
do\u I\u suppress
),但他的答案仍然有效。@KurzedMetal:不是“在每个元素上创建函数调用”,而是“在每个元素上创建函数并调用它”。
filter
创建一个
lambda
,然后调用lambda。清单上没有
python-mtimeit“[x代表x范围(100),如果x%2==0]”
给出
10000个循环,每个循环3:18.5usec的最佳值
python-mtimeit”过滤器(lambda x:x%2==0,xrange(100))”
给出
10000个循环,每个循环3:31.4usec的最佳值
,这要慢得多。@Claudiu该示例应该已经定义了一个列表和一个函数,当然,生成没有不需要的项的列表要比创建列表然后删除这些项快得多
py-m timeit“def is_偶数(x):如果x%2==0,则返回True;如果x是偶数(x)]“10000000个循环,每个循环最好3:0.138 usec
vs
py-m timeit”def是偶数(x):如果x%2==0,则返回True;否则为False;过滤器