繁体   English   中英

Python如何浏览嵌套列表/元组并保持层次结构

[英]Python how to browse a nested list/tuple keeping the hierarchy

我有这样的清单:

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>

"""

通过Beautiful Soup通过元组和列表的这种混合形式进行了转换:

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

为了列出保持层次结构的所有元素,我正在尝试如下操作:

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) 

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

你有什么建议吗?

谢谢。

您的助手功能不太正确。 尝试:

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)

这样一来,您就可以处理标记中任意深度的嵌套。

请尝试以下操作:

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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM