[英]Python how to browse a nested list/tuple keeping the hierarchy
我有这样的清单:
lista = """
<ul>
<li>Arts & Entertainment
<ul>
<li>Celebrities & Entertainment News</li>
<li>Comics & Animation
<ul>
<li>Anime & Manga</li>
<li>Cartoons</li>
<li>Comics</li>
</ul>
</li>
</ul>
</li>
</ul>
"""
通过Beautiful Soup通过元组和列表的这种混合形式进行了转换:
[(u'Arts & Entertainment',
[u'Celebrities & Entertainment News',
(u'Comics & Animation',
[u'Anime & 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 & Entertainment', [u'Celebrities & Entertainment News', (u'Comics & Animation', [u'Anime & Manga', u'Cartoons', u'Comics'])])]
>>> orderList2(item)
0 Arts & Entertainment tuple <br />
1 Celebrities & Entertainment News tuple <br />
1 Comics & Animation tuple <br />
2 Anime & 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.