2016-05-30 2 views
0

У меня есть код, как этотклыков из списка ElementTree поворота 0 после второго вызова

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)) 

И это дает мне Len списка product_iter 1, как и ожидалось.

Но если вызов Len (список (product_iter)) снова я получаю 0.

Я не понимаю, почему это происходит. Может ли кто-нибудь объяснить, почему переменная product_iter каким-то образом изменилась, чем вызов len в список?

Посмотрите на документацию по elementtree https://docs.python.org/2/library/xml.etree.elementtree.html Я не вижу никакой информации, как это объяснить.

С уважением Trygve

ответ

0

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 
+0

ах, хорошо. Я понимаю. Но список команд (product_iter) преобразует итератор в список. Можно ли это сделать без изменения итератора? –

+0

Как только итератор потребляется, его невозможно сбросить. Вы можете снова спросить дерево с помощью tree.iterfind ('.... 'или вместо этого использовать' tree.findall() '. – Jieter

+0

list() будет использовать ваш итератор, сохраните список, если вы хотите его использовать больше чем один раз. – Paul

0

Нижняя линия здесь, я думаю, чтобы понять, итераторы в Python.

Возможно, findall вместо iterfind лучше в этом случае.