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']
但我想应该有一个更聪明的解决方案。你有吗?
答案 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)