Python 如何在保持层次结构的情况下遍历嵌套列表/元组

1 投票
2 回答
1117 浏览
提问于 2025-04-17 12:59

我有这样一个列表:

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) 

但实际上这个方法并没有奏效……

你们有什么建议吗?

谢谢。

2 个回答

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)

这个代码会打印出字符串,当它遇到一个元组时,会增加层级,然后打印出那个元组里的字符串,直到再遇到另一个元组,然后继续这样下去。你在最开始提问时用到的全局变量其实没必要。

然后在你的顶层元组上调用这个函数,让它开始工作:

orderList2(0, item)

这样你就可以处理任意深度的嵌套结构了。

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 格式的。

撰写回答