我正在迭代Python中的元素列表,对其执行某些操作,然后在满足特定条件时将其删除.
for element in somelist:
do_action(element)
if check(element):
remove_element_from_list
Run Code Online (Sandbox Code Playgroud)
我应该用什么代替remove_element?我已经看到了类似的问题,但注意到要为所有元素执行的do_action部分的存在,从而消除了使用过滤器的解决方案.
blu*_*ume 139
您可以随时遍历列表的副本,让您可以自由修改原始文件:
for item in list(somelist):
...
somelist.remove(item)
Run Code Online (Sandbox Code Playgroud)
Joh*_*hin 122
要满足这些标准:原位修改原始列表,没有列表副本,只有一个通过,有效,传统的解决方案是向后迭代:
for i in xrange(len(somelist) - 1, -1, -1):
element = somelist[i]
do_action(element)
if check(element):
del somelist[i]
Run Code Online (Sandbox Code Playgroud)
额外奖励:len(somelist)每次迭代都不做.适用于任何版本的Python(至少可以追溯到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
Run Code Online (Sandbox Code Playgroud)
zee*_*kay 10
清单组合:
results = [x for x in (do_action(element) for element in somelist) if check(element)]
Run Code Online (Sandbox Code Playgroud)
for element in somelist:
do_action(element)
somelist[:] = (x for x in somelist if not check(x))
Run Code Online (Sandbox Code Playgroud)
如果你真的需要一次性完成它而不复制列表
i=0
while i < len(somelist):
element = somelist[i]
do_action(element)
if check(element):
del somelist[i]
else:
i+=1
Run Code Online (Sandbox Code Playgroud)
您仍然可以使用过滤器,移动到外部函数元素修改(迭代一次)
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)
Run Code Online (Sandbox Code Playgroud)