【问题标题】:lenght of a list of elementtree turn 0 after second call第二次调用后 elementtree 列表的长度变为 0
【发布时间】:2016-05-30 11:45:23
【问题描述】:

我有这样的代码

import xml.etree.ElementTree as etree
tree = etree.fromstring("<all_products><product instrument_name='nice_instrument'></product></all_products>")
product_iter = tree.iterfind("product[@instrument_name='nice_instrument']")
len(list(product_iter))

这给了我预期的 product_iter 1 列表的 len。

但是如果再次调用 len(list(product_iter)) 我得到 0。

我不明白为什么会这样。有人可以解释为什么 product_iter 变量在调用 len 到列表时会以某种方式发生变化吗?

查看 elementtree https://docs.python.org/2/library/xml.etree.elementtree.html 的文档,我没有看到任何信息来解释这一点。

问候 试一试

【问题讨论】:

    标签: python list elementtree


    【解决方案1】:

    product_iter 是一个迭代器,而不是一个列表。如果将其转换为列表,len 将保持为1

    >>> import xml.etree.ElementTree as etree
    >>> tree = etree.fromstring("<all_products><product instrument_name='nice_instrument'></product></all_products>")
    >>> product_iter = tree.iterfind("product[@instrument_name='nice_instrument']")
    >>> products = list(product_iter)
    >>> len(products)
    1
    >>> len(products)
    1
    

    【讨论】:

    • 啊,好的。我明白。但是命令 list(product_iter) 将迭代器转换为列表。是否可以在不修改迭代器的情况下做到这一点?
    • 一旦迭代器被消耗,就无法重置它。您可以使用tree.iterfind('.... 再次询问树,或者改用tree.findall()
    • a list() 将消耗您的迭代器,如果您想多次使用它,请保存该列表。
    【解决方案2】:

    我认为这里的底线是理解python中的迭代器。

    在这种情况下,也许 findall 而不是 iterfind 更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      相关资源
      最近更新 更多