当前位置: 首页 > 面试题库 >

ElementTree:Element.remove()跳跃迭代

闾丘朗
2023-03-14
问题内容

我有这个xml输入文件:

<?xml version="1.0"?>
<zero>
  <First>
    <second>
      <third-num>1</third-num>
      <third-def>object001</third-def>
      <third-len>458</third-len>
    </second>
    <second>
      <third-num>2</third-num>
      <third-def>object002</third-def>
      <third-len>426</third-len>
    </second>
    <second>
      <third-num>3</third-num>
      <third-def>object003</third-def>
      <third-len>998</third-len>
    </second>
  </First>
</zero>

我的目标是删除<third-def>没有价值的任何第二层。为此,我编写了以下代码

try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET
inputfile='inputfile.xml'
tree = ET.parse(inputfile)
root = tree.getroot()

elem = tree.find('First')
for elem2 in tree.iter(tag='second'):
    if elem2.find('third-def').text == 'object001':
        pass
    else:
        elem.remove(elem2)
        #elem2.clear()

我的问题是elem.remove(elem2)。它每隔第二级跳过一次。这是此代码的输出:

<?xml version="1.0" ?>
<zero>
  <First>
    <second>
      <third-num>1</third-num>
      <third-def>object001</third-def>
      <third-len>458</third-len>
    </second>
    <second>
      <third-num>3</third-num>
      <third-def>object003</third-def>
      <third-len>998</third-len>
    </second>
  </First>
</zero>

现在,如果我取消注释该elem2.clear()行,则脚本可以完美运行,但是输出效果不佳,因为它保留了所有已删除的 第二级

<?xml version="1.0" ?>
<zero>
  <First>
    <second>
      <third-num>1</third-num>
      <third-def>object001</third-def>
      <third-len>458</third-len>
    </second>
    <second/>
    <second/>
  </First>
</zero>

有人知道我的element.remove()陈述为什么错误吗?


问题答案:

您正在遍历活动树:

for elem2 in tree.iter(tag='second'):

然后在迭代时进行更改。该迭代的“计数器”将不被告知更改的一些元素,所以元素0前瞻性和上元件数1移除元素,迭代器然后移动,但什么时候
单元号1现在是单元号0。

首先捕获所有元素的列表,然后在其上循环:

for elem2 in tree.findall('.//second'):

.findall() 返回结果列表,该列表在您更改树时不会更新。

现在迭代不会跳过最后一个元素:

>>> print ET.tostring(tree)
<zero>
  <First>
    <second>
      <third-num>1</third-num>
      <third-def>object001</third-def>
      <third-len>458</third-len>
    </second>
    </First>
</zero>

这种现象不仅限于ElementTree树;请参阅循环“忘记”以删除一些项目



 类似资料:
  • 跳跃表(skiplist)是一种随机化的数据, 由 William Pugh 在论文《Skip lists: a probabilistic alternative to balanced trees》中提出, 跳跃表以有序的方式在层次化的链表中保存元素, 效率和平衡树媲美 —— 查找、删除、添加等操作都可以在对数期望时间下完成, 并且比起平衡树来说, 跳跃表的实现要简单直观得多。 以下是个典型的

  • 在我的跳棋代码中,我试图让它这样做,每当一个棋子落在它能够跳跃的地方时,它就会被强制跳跃。在我的代码中,它会突出显示你可以跳跃的地方。我已经做了它,这样你就可以跳跃其他棋子之类的,但是我还没有找到一种方法来强迫玩家跳跃。使用布尔值和一种方法更可取的是扫描棋盘进行跳跃并禁用所有的图块,除了正在跳跃的图块和你将要跳跃的图块。 主要类别 结束主类 平铺等级 结束瓷砖类 你有什么想法或建议吗?

  • 我想创造一个像飞鸟一样的游戏。我想让玩家在屏幕上不断跳跃。我创造了这个代码,它不像一只扑翼鸟跳 代码: 问题是当用户在屏幕上快速点击时,玩家就像火箭一样被击中。当玩家跌倒时,跳跃更低。我该如何解决这个问题,并获得相同的跳跃强度? 我的解决方案:

  • 《游戏跳跃》是一款模拟开发游戏的放置游戏,和《卡牌冒险》《稳定宝石放置》一样,用的同一个增量游戏开发模板开发的。

  • 跟踪程序执行流程是阅读代码的一种方式。另一种可选的方式我称之为“思路跳跃”。 当你遇到一个函数调用,我们不去跟踪执行流程,而是假定函数工作正常并返回合适的值。 事实上,我们前面已经使用过思路跳跃,比如调用内置函数。当调用cos或exp时,我们并没有检查函数的实现。我们只是假定这些函数能正常工作,因为设计库的都是很厉害的程序员。 调用自己写的函数也是如此。例如,在5.8节我们写了一个函数isSing

  • 本文向大家介绍python3实现跳一跳点击跳跃,包括了python3实现跳一跳点击跳跃的使用技巧和注意事项,需要的朋友参考一下 借鉴了网上一些大神的代码和思路,这里整理一下写出点击跳跃玩跳一跳这个小游戏的思路 一、整体思路 棋子所在的坐标以及下一步所要到的坐标,根据两个坐标计算出两点之间距离进行跳跃。 二、分布思路 1、根据命令截图获取初始图保存到手机,然后上传到本地文件夹 2、将获取的截图放入新