• 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'
  • 相关阅读:
    List 与 Array 的相互转化及 List、Array、Set转为 String
    Java 序列化介绍及 Redis 序列化方式
    SpringBoot 整合 redis 实现 token 验证
    SpringBoot 整合 Redis 使用
    Map 某 value 为 对象数组,转为 ArrayList 对象集合
    JWT 基本使用
    Spring session + redis 实现 session共享入门
    HttpServletRequest + Filter 添加 header
    Git ahead(超前) 又behind(落后)
    web应用中路径跳转问题-相对路径、绝对路径
  • 原文地址:https://www.cnblogs.com/Lee-yl/p/9221157.html
Copyright © 2020-2023  润新知