“树”结构化列表:
[(1,1,(1,1,(1,"1"))),(1,1,1),(1,),1,(1,(1,("1")))] # may be more complex
如何遍历它并打印每个项目 - 我的意思是1和“1”?
如何生成具有相同结构的类型列表?
[( 'INT', 'INT',( 'INT', 'INT',( 'INT', 'STR'))),( 'INT', 'INT', 'INT'),(” INT”,), 'INT',( 'INT',( 'INT',( 'STR')))]
'int','str'这里应输出类型(1)和类型(“s”),因为它无法显示在问题上
谢谢!
答案 0 :(得分:4)
您可以为(1)创建一个将为您遍历树的生成器。
def traverse(o, tree_types=(list, tuple)):
if isinstance(o, tree_types):
for value in o:
for subvalue in traverse(value):
yield subvalue
else:
yield o
data = [(1,1,(1,1,(1,"1"))),(1,1,1),(1,),1,(1,(1,("1",)))]
print list(traverse(data))
# prints [1, 1, 1, 1, 1, '1', 1, 1, 1, 1, 1, 1, 1, '1']
for value in traverse(data):
print repr(value)
# prints
# 1
# 1
# 1
# 1
# 1
# '1'
# 1
# 1
# 1
# 1
# 1
# 1
# 1
# '1'
这是(2)的一种可能方法。
def tree_map(f, o, tree_types=(list, tuple)):
if isinstance(o, tree_types):
return type(o)(tree_map(f, value, tree_types) for value in o)
else:
return f(o)
data = [(1,1,(1,1,(1,"1"))),(1,1,1),(1,),1,(1,(1,("1",)))]
print tree_map(lambda o: type(o).__name__, data)
# prints [('int', 'int', ('int', 'int', ('int', 'str'))), ('int', 'int', 'int'), ('int',), 'int', ('int', ('int', ('str',)))]
答案 1 :(得分:3)
您可以使用递归轻松地遍历任何树状结构。只需定义一个可以查看所有孩子的函数。虽然传统上每个孩子本身就是一棵树,但在你的情况下,可能。所以我想你可以这样做:
def traverseit(tree):
if hasattr(tree, '__iter__'):
for subtree in tree:
traverseit(subtree)
else:
print(tree)
<小时/> 对于你的第二个问题,假设你只想获得一个用它们的类型替换“节点”的新“树”,简单:
def transformit(tree):
nodetype = type(tree)
if hasattr(tree, '__iter__'):
return nodetype(transformit(subtree) for subtree in tree)
else:
return nodetype
答案 2 :(得分:0)
对于#2你可以使用这个递归lamba函数并在map
中使用它 f = lambda o: (isinstance(o, tuple) and tuple(map(f, o))) or type(o).__name__
map(f, [(1,1,(1,1,(1,"1"))),(1,1,1),(1,),1,(1,(1,("1")))])
返回: [('int','int',('int','int',('int','str'))),('int','int','int'),('int', ),'int',('int',('int','str'))]