Python:在lis上迭代时删除list元素

2024-06-26 03:34:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python中遍历一个元素列表,对其执行一些操作,然后在满足某些条件时删除它们。

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

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


Tags: infrom元素过滤器列表forifcheck
3条回答

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

for item in list(somelist):
  ...
  somelist.remove(item)

列表组件:

results = [x for x in (do_action(element) for element in somelist) if check(element)]

为了满足以下条件:原地修改原始列表,不复制列表,只执行一次操作,有效,传统的解决方案是向后迭代

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/X范围/范围/对于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

相关问题 更多 >