2017-02-22 58 views
0

Я использую IronPython 2.7 и ElementTree.xml - длина подсписка в списке - ТипError: len() несезонного объекта

Код: Я получаю все счетные узлы ниже AX. Я добавляю каждый узел в lyst. После этого мне нужна длина каждого подсписок в lyst.

Это всего лишь пример xml. Мой реальный xml намного больше и сложнее.

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<main> 

    <ex> 
     <top> 
       <AX> 
        <count>a</count> 
        <count>b</count> 
        <count>c</count> 
       </AX> 
       <AX> 
        <count>a</count> 
       </AX> 
       <AX> 
        <count>a</count> 
        <count>b</count> 
        <count>c</count> 
        <count>d</count> 
       </AX> 
     </top> 
    </ex> 
</main> 

код:

import clr 
import sys 
clr.AddReference('ProtoGeometry') 
from Autodesk.DesignScript.Geometry import * 
sys.path.append("C:\Program Files (x86)\IronPython 2.7\Lib") 
import xml.etree.ElementTree as ET 

uniStr = unicode(open(path, 'r').read()) 
fixed = uniStr.encode('ascii', 'replace') 
fixed.decode('utf-8', 'replace') 
tree = ET.ElementTree(ET.fromstring(fixed)) 
root = tree.getroot() 

lyst=[] 
count=[] 
xpath=".//top//AX" 
xpath2=".//count" 

count_match = root.findall(xpath) 

for elem in count_match: 
    subelem=elem.iterfind(xpath2) 
    lyst.append(subelem) 

count.append(map(len,lyst)) 
#count.append([len(x) for x in lyst]) 

print count 

Я ожидаю: count[3,1,4], но получил эту ошибку: питон TypeError: len() of unsized object.

Edit: С списковых: count.append ([Len (х) при х в Lyst])

же ошибка: TypeError: len() of unsized object.

Как я могу подсчитать объекты в подсписках?

+0

Ваш список понимание должно выглядеть следующим образом 'count.append ([Len (х) при х в Lyst ]) ', все жесткие вы можете получить другую ошибку впоследствии. Кстати, я предлагаю вам использовать понимание списка для 'lyst'. Сохраняет 3 линии !!!! – Elmex80s

ответ

1

Ошибка проста, элементы в lyst являются генераторами, поэтому вы не можете задать их длину. Сначала вы должны преобразовать их в список count = [len(list(x)) for x in lyst].

Теперь выход будет

[3, 1, 4] 

, как и ожидалось.

Если вы используете PyCharm, вы можете легко найти это, отладив код. Вот где он выходит из строя:

enter image description here

Я также рекомендую вам использовать список понимание

lyst = [elem.iterfind(xpath2) for elem in count_match] 
+0

Thx за вашу помощь! Я использую Dynamo (не могу использовать другую среду программирования), и нет отладчика :( – Yuli

+0

Я вижу. В этом случае вы можете использовать 'print' вокруг номеров строк, где вы ожидаете аварии. Удачи вам в вашем проекте. – Elmex80s

 Смежные вопросы

  • Нет связанных вопросов^_^