2017-02-22 12 views
0

IronPython 2.7およびElementTreeを使用します。xml - リスト内のサブリストの長さ - TypeError:未定義オブジェクトの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]が、このエラーを得た:pythonのTypeError: len() of unsized object

編集:リスト内包で :count.append([LEN(X)のXにおけるlyst])

同じエラー:TypeError: len() of unsized object

どのようにサブリストのオブジェクトを数えることができますか?

+0

あなたのリストの内包は、[LEN(x)のためのx lystに(この 'count.appendのようになります。 ]) '、あなたは後で別のエラーを受け取るかもしれません。 btw: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

関連する問題