如何在for循环中删除迭代器对象的元素



这是一个超级简单的

import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()
delete = False
for child in root:
    if delete:
        root.remove(child)
        continue
    if child.getchildren():
        delete = True

我想要的是保留第一个孩子,并删除所有后续的孩子。

但这里只删除了"交替"元素。

对于正常序列,我们可以使用

for child in root[:]:

或者在物体的情况下,我们可以使用

from copy import deepcopy
for child in deepcopy(root):

但如果我这样做,我不会得到"root"的子实例,而是副本的唯一子实例,所以我不能用它来删除root的子实例。

有什么想法吗?

PS:我使用child.getchildren()是因为我需要保留第一个有自己孩子的孩子。

编辑

受Ashalynd下面评论的启发,我尝试了简单的切片

for child in root[:]:

它奏效了。我一直认为,由于root是一个实例,所以切片不起作用。

但现在我想知道为什么以下内容不起作用?

from copy import copy
for child in copy(root):

由于浅拷贝本质上是在对自身进行切片。

如果您需要在某一点后停止:

for i, child in enumerate(root):
    if child.getchildren():
        pruned_children = root[:i]
        break

然后从那时起只使用pruned_children

最新更新