2012-02-13 115 views
1

我有这样的一个列表:Python的浏览嵌套列表/元组保持层次

lista = """ 
<ul> 
<li>Arts &amp; Entertainment 
<ul> 
    <li>Celebrities &amp; Entertainment News</li> 
    <li>Comics &amp; Animation 
    <ul> 
    <li>Anime &amp; Manga</li> 
    <li>Cartoons</li> 
    <li>Comics</li> 
    </ul> 
    </li> 
</ul> 
</li> 
</ul> 

""" 

穿过美丽的汤被转换在这种元组和列表的混合:

[(u'Arts &amp; Entertainment', 
    [u'Celebrities &amp; Entertainment News', 
    (u'Comics &amp; Animation', 
    [u'Anime &amp; Manga', u'Cartoons', u'Comics'])])] 

为了列出所有的元素保持hierarchi我是想这样的事情:

myLevel = 0 
def orderList2(item): 
    global myLevel 
    for i in item: 
     if isinstance(i, str): 
      print str(myLevel) + " " + str(i.encode("utf-8")) + " tuple <br/>"    
     elif isinstance(i, tuple): 
      print str(myLevel) + " " + str(i[0].encode("utf-8")) + " tuple <br/>" 
     orderList2(item) 

但它实际上并没有真正的工作...

你有什么建议吗?

谢谢。

+0

那么,你永远不会改变'myLevel' ... – Amber 2012-02-13 22:50:32

回答

0

尝试以下操作:

def orderList2(item, level=0): 
    for i in item: 
     if isinstance(i, basestring): 
      print level, i.encode('utf-8'), 'tuple <br />' 
     elif isinstance(i, tuple): 
      orderList2(i, level) 
     else: 
      orderList2(i, level+1) 

这里是为您的数据输出:

>>> item = [(u'Arts &amp; Entertainment', [u'Celebrities &amp; Entertainment News', (u'Comics &amp; Animation', [u'Anime &amp; Manga', u'Cartoons', u'Comics'])])] 
>>> orderList2(item) 
0 Arts &amp; Entertainment tuple <br /> 
1 Celebrities &amp; Entertainment News tuple <br /> 
1 Comics &amp; Animation tuple <br /> 
2 Anime &amp; Manga tuple <br /> 
2 Cartoons tuple <br /> 
2 Comics tuple <br /> 

注意,而是采用了全球层面的变量,这只是通过在当前水平,使用递归。此外,在您的版本中,递归调用是orderList2(item),当时您可能打算用i来调用它。而不是打印元组中的第一个项目,而只是进行具有相同级别的递归调用,并且使用列表进行递归调用并递增级别。最后,不是检查isinstance(i, str),而是检查basestring,这是必要的,因为数据中的字符串是unicode。

+0

谢谢,它的作品完美,你的解释非常清楚。 – lorussian 2012-02-15 21:57:27

+0

@silviolor - 没问题,你可以[接受我的回答](http://meta.stackexchange.com/a/5235/155356),点击回答旁边复选标记的大纲,以便其他人知道你的问题是解决。 – 2012-02-15 22:09:21

0

你的帮手功能并不完全正确。尝试:

def orderList2(myLevel, item): 
    for i in item: 
    if isinstance(i, str): 
     print str(myLevel) + " " + str(i.encode("utf-8")) + " tuple <br/>"    
    elif isinstance(i, tuple): 
     visit(myLevel + 1, i) 

打印出字符串,当它击中一个元组,递增级别,并打印出该元组串,直到碰到另一个多元组,等等等等。无需您的OP中的全局变量。

然后调用你的顶层元组,让它去镇:

orderList2(0, item) 

这让您在处理您的标记嵌套的任意深度。