如何在Python中遍历“列表”树并获取相同结构的类型(item)列表?

2 投票
3 回答
2473 浏览
提问于 2025-04-16 19:14

“树”结构的列表:

[(1,1,(1,1,(1,"1"))),(1,1,1),(1,),1,(1,(1,("1")))]  # may be more complex
  1. 如何遍历这个结构并打印每个项目 - 我是指数字1和字符串“1”吗?

  2. 如何生成一个结构相同的类型列表?

    [('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',)))]

撰写回答