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

时间:2014-08-26 13:47:29

标签: python

这很简单

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'但只有副本的子实例,所以我不能用它来删除root的孩子。

请有任何想法吗?

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

修改

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

for child in root[:]:

有效。我一直认为,由于root是一个实例,切片不会起作用。

但现在我想知道为什么以下没有用?

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

因为浅拷贝本质上是切片。

1 个答案:

答案 0 :(得分:1)

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

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

然后从那时开始使用pruned_children