• python列表推导式详解 列表推导式详解 字典推导式 详解 集合推导式详解 嵌套列表推导式详解


    推导式是Python中很强大的、很受欢迎的特性,具有语言简洁,简化代码,速度快等优点。推导式包括:
    1.列表推导式
    2.字典推导式
    3.集合推导式
    4.嵌套列表推导式
    注意: 字典和集合推导是最近才加入到Python的(Python 2.7 和Python 3.1以上版). 下面简要介绍下:

    第一:列表推导式

      列表推导式也叫列表解析式。
      功能:是提供一种方便的列表创建方法,只用一条简洁的表达式即可对得到的元素进行转换变形,所以,列表解析式返回的是一个列表
      格式:用中括号括起来,中间用for语句,后面跟if语句用作判读,满足条件的传到for语句前面用作构建先的列表

      其基本格式如下:

        [expr for value in collection ifcondition]
    

      过滤条件可有可无,取决于实际应用,只留下表达式;相当于下面这段for循环:   

      result = []  
      for value in collection:  
          if condition:  
              result.append(expression)  
    

      例1:  过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母   

      >>> names = ['Bob','Tom','alice','Jerry','Wendy','Smith']  
      >>> [name.upper() for name in names if len(name)>3]  
      ['ALICE', 'JERRY', 'WENDY', 'SMITH']  
    

      例2:  求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表

      >>> [(x,y) for x in range(5) if x%2==0 for y in range(5) if y %2==1]  
      [(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]
    

      例3:  求M中3,6,9组成的列表

      >>> M = [[1,2,3],
      ...      [4,5,6],
      ...      [7,8,9]]
      >>> M  
      [[1, 2, 3], [4, 5, 6], [7, 8, 9]]  
      >>> [row[2] for row in M]  
      [3, 6, 9] 
    
      #或者用下面的方式  
      >>> [M[row][2] for row in (0,1,2)]  
      [3, 6, 9]  
    

      例4:  求M中斜线1,5,9组成的列表 

      >>> M  
      [[1, 2, 3], [4, 5, 6], [7, 8, 9]]  
      >>> [M[i][i] for i in range(len(M))]  
      [1, 5, 9]  

      例5:  求M,N中矩阵和元素的乘积

      >>> M = [[1,2,3],  
      ...      [4,5,6],  
      ...      [7,8,9]]  
      >>> N = [[2,2,2],  
      ...      [3,3,3],  
      ...      [4,4,4]]  
        >>> [M[row][col]*N[row][col] for row in range(3) for col in range(3)]  
      [2, 4, 6, 12, 15, 18, 28, 32, 36]  
      >>> [[M[row][col]*N[row][col] for col in range(3)] for row in range(3)]  
      [[2, 4, 6], [12, 15, 18], [28, 32, 36]]  
      >>> [[M[row][col]*N[row][col] for row in range(3)] for col in range(3)]  
      [[2, 12, 28], [4, 15, 32], [6, 18, 36]]  

      例5:  讲字典中age键,按照条件赋新值

      

      >>> bob  
      {'pay': 3000, 'job': 'dev', 'age': 42, 'name': 'Bob Smith'}  
      >>> sue  
      {'pay': 4000, 'job': 'hdw', 'age': 45, 'name': 'Sue Jones'}  
      >>> people = [bob, sue]  
      >>> [rec['age']+100 if rec['age'] >= 45 else rec['age'] for rec in people]  # 注意for位置  
      [42, 145]  

    第二:字典推导式

      字典和集合推导式是该思想的延续,语法差不多,只不过产生的是集合和字典而已。其基本格式如下:

        { key_expr: value_expr for value in collection if condition }

      例1:  用字典推导式以字符串以及其长度建字典

      >>> strings = ['import','is','with','if','file','exception']  
      >>> D = {key: val for val,key in enumerate(strings)}   
      >>> D  
      {'exception': 5, 'is': 1, 'file': 4, 'import': 0, 'with': 2, 'if': 3}  
    

      例2:  大小写key合并

        mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
        mcase_frequency = {
            k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0)
            for k in mcase.keys()
            if k.lower() in ['a','b']
        }
        print mcase_frequency
        #  Output: {'a': 17, 'b': 34}
    

      例3.快速更换key和value

      mcase = {'a': 10, 'b': 34}
      mcase_frequency = {v: k for k, v in mcase.items()}
      print mcase_frequency
      #  Output: {10: 'a', 34: 'b'}

    第三:集合推导式

      集合推导式跟列表推导式非常相似,唯一区别在于用{}代替[]。其基本格式如下:

      { expr for value in collection if condition }
    

      例1:  用集合推导建字符串长度的集合

      >>> strings = ['a','is','with','if','file','exception']  
      >>> {len(s) for s in strings}    #有长度相同的会只留一个,这在实际上也非常有用  
      set([1, 2, 4, 9])  
    

    第四:嵌套列表推导式

      嵌套列表是指列表中嵌套列表,比如说: 
      >>> L = [[1,2,3],  
               [4,5,6],  
               [7,8,9]]  
    

       例1: 一个由男人列表和女人列表组成的嵌套列表,取出姓名中带有两个以上字母e的姓名,组成列表

          names = [['Tom','Billy','Jefferson','Andrew','Wesley','Steven','Joe'],  
                   ['Alice','Jill','Ana','Wendy','Jennifer','Sherry','Eva']]  
    

      用for循环实现:

      tmp = []  
      for lst in names:  
          for name in lst:  
              if name.count('e') >= 2:  
                  tmp.append(name)  
      
      print tmp  
      #输出结果  
      >>>   
      ['Jefferson', 'Wesley', 'Steven', 'Jennifer']  
    

      用嵌套列表实现:

      >>> names = [['Tom','Billy','Jefferson','Andrew','Wesley','Steven','Joe'],  
               ['Alice','Jill','Ana','Wendy','Jennifer','Sherry','Eva']]   
      >>> [name for lst in names for name in lst if name.count('e')>=2]  #注意遍历顺序,这是实现的关键  
      ['Jefferson', 'Wesley', 'Steven', 'Jennifer']  
    

      

    本文链接:http://www.cnblogs.com/xuchunlin/p/6059707.html  

  • 相关阅读:
    POJ 2236 Wireless Network(并查集)
    POJ 2010 Moo University
    POJ 3614 Sunscreen(贪心,区间单点匹配)
    POJ 2184 Cow Exhibition(背包)
    POJ 1631 Bridging signals(LIS的等价表述)
    POJ 3181 Dollar Dayz(递推,两个long long)
    POJ 3046 Ant Counting(递推,和号优化)
    POJ 3280 Cheapest Palindrome(区间dp)
    POJ 3616 Milking Time(dp)
    POJ 2385 Apple Catching(01背包)
  • 原文地址:https://www.cnblogs.com/xuchunlin/p/6059707.html
Copyright © 2020-2023  润新知