一尘不染

Python:在遍历列表时删除列表元素

python

我正在遍历Python中的元素列表,对其进行一些操作,然后在满足特定条件的情况下将其删除。

for element in somelist:
    do_action(element)
    if check(element):
        remove_element_from_list

我应该使用什么来代替remove_element?我曾问过类似的问题,但注意到将对所有元素执行do_action部分,因此消除了使用过滤器的解决方案。


阅读 622

收藏
2020-02-16

共2个答案

一尘不染

你始终可以遍历列表的副本,从而可以自由修改原始列表:

for item in list(somelist):
  ...
  somelist.remove(item)
2020-02-16
一尘不染

为了满足这些条件:修改原位最初的名单,没有列表的副本,只有一通,工程,传统的解决方案是迭代向后:

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

更新:如果要迭代转发,则可能会更加棘手和丑陋:

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
2020-02-16