如何在Python中遍历“列表”树并获取相同结构的类型(item)列表?
“树”结构的列表:
[(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'应该是type(1)和type("s")的输出,因为在问题中无法显示。
谢谢!
3 个回答
0
对于第二个问题,你可以使用这个递归的lambda函数,并在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'))]
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
4
你可以创建一个生成器,它会帮你遍历树结构,完成第一个任务。
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'
这里有一种可能的方法来解决第二个任务。
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',)))]