我正在遍历Python中的元素列表,对其进行一些操作,然后在满足特定条件的情况下将其删除。
for element in somelist: do_action(element) if check(element): remove_element_from_list
我应该使用什么来代替remove_element?我曾问过类似的问题,但注意到将对所有元素执行do_action部分,因此消除了使用过滤器的解决方案。
remove_element
do_action
你始终可以遍历列表的副本,从而可以自由修改原始列表:
for item in list(somelist): ... somelist.remove(item)
为了满足这些条件:修改原位最初的名单,没有列表的副本,只有一通,工程,传统的解决方案是迭代向后:
for i in xrange(len(somelist) - 1, -1, -1): element = somelist[i] do_action(element) if check(element): del somelist[i]
奖励:并非len(somelist)在每次迭代中都执行。适用于任何版本的Python(至少可追溯到1.5.2)... s / xrange / range / for3.X。
len(somelist)
... s / xrange / range / for3.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