遍历“列表”树并获取python中具有相同结构的类型(项)列表?

时间:2011-06-09 08:34:35

标签: python list tree traversal

“树”结构化列表:

[(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'这里应输出类型(1)和类型(“s”),因为它无法显示在问题上

  3. 谢谢!

3 个答案:

答案 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'))]