zoukankan      html  css  js  c++  java
  • Python学习笔记:列表推导式

    一、介绍

    Python 中有个语法糖(syntactic sugar),就是 list comprehension,即“列表推导式”。

    同样适用于 dictset 等一系列可迭代的数据结构。

    • 使用语法
    out_list = [x for x in list if express_condition]
    

    其中的 if 条件判断语句可有可无。

    二、range函数

    Pythonrange 函数可以用来创建一个整数列表,一般用在 for 循环中。

    • 使用语法
    range(start, stop, [, step])
    start -- 开始
    stop -- 结束(不包含)
    setp -- 步长
    

    列表推导式是通过一个可迭代对象来生成列表,range 是列表推导式中最常用的可迭代对象,是精髓之一。

    三、实操

    1.列表推导式

    • 列表推导式会遍历可迭代对象,然后按照 for 前的表达式进行运算,生成最终的列表
    • 如果有 if 条件语句, for 遍历后紧跟着进行条件判断
    • 如果有多个 for 循环,则最终的数据数量为多个 for 循环的笛卡尔积
    • 可以进行嵌套的列表推导,与嵌套 for 循环的原理相同
    [x**2 for x in range(10)]
    # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    
    [x**2 for x in range(10) if x > 5]
    # [36, 49, 64, 81]
    
    [x for x in range(10) if x % 2 == 0]
    # [0, 2, 4, 6, 8]
    
    [(x, x**2) for x in range(5)]
    # [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16)]
    
    dict([(x, x**2) for x in range(5)])
    # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
    
    [(x, y) for x in range(10) if x % 2 if x > 3 for y in range(10) if y > 7 if y != 8]
    # [(5, 9), (7, 9), (9, 9)]
    
    a = [2,4,6]
    b = [4,3,-9]
    [a[i] + b[i] for i in range(len(a))]
    # [6, 7, -3]
    
    [x * y for x in [1,2,3] for y in [1,2,3]]
    # [1, 2, 3, 2, 4, 6, 3, 6, 9]
    
    li = [1,2,3,4]
    def mul2(x):
        return x*2
    [mul2(i) for i in li]
    # [2, 4, 6, 8]
    
    # 嵌套循环 展平矩阵
    matrix = [[1,2,3], [4,5,6], [7,8,9]]
    [i for row in matrix for i in row]
    # [1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    2.字典(dict)和集合(set)推导式

    • 将字典key和value互换
    dic = {'a':10, 'b':20, 'c':30}
    {value: key for key, value in dic.items()} # 返回键值对
    # {10: 'a', 20: 'b', 30: 'c'}
    
    • 提取首字母
    words_list = ['apple', 'oppo', 'vivo', 'xiaomi']
    set(w[0] for w in words_list)
    # {'a', 'o', 'v', 'x'}
    

    集合是无序且不重复的,会自动去掉重复的元素。

    三、总结

    总的来说,就是把普通的多行 for 循环压缩成一行代码。

    这种压缩语法适用于列表、字典、集合等可迭代数据结构。

    • 代码可读性 只需要一行代码
    • 局部作用域 不存在变量泄露问题
    • 尽量保持简洁

    参考链接:Python的列表推导式

    参考链接:Python中的列表推导式

    参考链接:Python列表推导式

  • 相关阅读:
    Oracle查询错误分析:ORA-01791:不是SELECTed表达式
    Java中DESKeySpec类
    linux发布项目
    mac下搭建cocos2d-x2.2.1版本android编译环境教程
    使用Eigen求解线性方程组
    视觉SLAM十四讲课后答案-ch1
    costmap_2d: obstacle_layer中关于激光雷达障碍物清除不干净的解决
    ch4 激光的前端配准算法一 —— ICP方法
    Project 'cv_bridge' specifies '/usr/include/opencv' as an include dir, which is not found.
    ch3 传感器数据处理II: 激光雷达运动畸变去除
  • 原文地址:https://www.cnblogs.com/hider/p/15509427.html
Copyright © 2011-2022 走看看