zoukankan      html  css  js  c++  java
  • Python笔记24-----迭代器、生成器的使用(如嵌套列表的展开、树的遍历等)

    一、递归yield使用

    可把yield当做return,其作用是把一个函数变成一个迭代器。

    1、嵌套列表展开

    def flatten(nested):
        if type(nested)==list:
            for sublist in nested:
                for i in flatten(sublist):
                    yield i
        else:
            yield nested
    print(list(flatten([[[1],2],3,4,[5,[6,7]],8])))

    #结果为[1,2,3,4,5,6,7,8]

    2、树的后序遍历

        def postorderTraversal(self, root):
            def iter(root):
                if root:
                    for x in iter(root.left):
                        yield x
                    for x in iter(root.right):
                        yield x
                    yield root.val
            return list(iter(root))

    2、建立所有的二叉搜索树

    给定一个数n,从【1,2,……,n】能够建立多少棵不同的二叉搜索树

    class TreeNode:
        def __init__(self,root):
            self.val=root
            self.left=None
            self.right=None
    #用生成器建立所有树
    def builtTree(start,end): if start>end: yield None for j in range(start,end+1): for j_left in builtTree(start,j-1): for j_right in builtTree(j+1,end): root=TreeNode(j) root.left=j_left root.right=j_right yield root
    #调用建树函数
    def test(n): if n==0: return [] return list(builtTree(1,n))

     2、二叉搜索树按序输出

    class BSTIterator(object):
        def __init__(self, root):
            """
            :type root: TreeNode
            """
            self.stack=[]
            while root:
                self.stack.append(root)
                root=root.left
                    
        
        def hasNext(self):
            """
            :rtype: bool
            """
            return len(self.stack)>0
            
    
        def next(self):
            """
            :rtype: int
            """
            node=self.stack.pop()
            x=node.right
            while x:
                self.stack.append(x)
                x=x.left
            return node.val

     二、itertools

    1、chain():

    把一组迭代对象串联起来,形成一个更大的迭代器

    若在多个对象执行相同的操作,但这些对象在不同的容器中,如果希望代码在不
    失可读性的情况下避免写重复的循环

    from itertools import chain
    
    for c in itertools.chain('ABC', 'XYZ'):
        print(c)
    # 迭代效果:'A' 'B' 'C' 'X' 'Y' 'Z'
    
    a = [1, 2, 3, 4]
    b = [‘x’, ‘y’, ‘z’]
    for x in chain(a, b):
        print(x)
    
    #迭代结果:1,2,3,4,'x','y','z'
  • 相关阅读:
    [2013腾讯马拉松 3月23日]HDU 4517 小小明系列故事——游戏的烦恼
    金山西山居初赛第三场 HDU 4551~HDU 4553
    Redis安装
    前端常用网址汇总
    Html5移动端页面布局通用模板暨移动端问题总结
    js数组去重,并统计最多项算法
    纯css实现下拉菜单
    js实现求平均数功能
    Html5+css3实现3D转动效果
    移动设备分辨率及响应式断点汇总
  • 原文地址:https://www.cnblogs.com/Lee-yl/p/9221157.html
Copyright © 2011-2022 走看看