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列表推导式

  • 相关阅读:
    bzoj3505 数三角形 组合计数
    cogs2057 殉国 扩展欧几里得
    cogs333 荒岛野人 扩展欧几里得
    bzoj1123 BLO tarjan求点双连通分量
    poj3352 road construction tarjan求双连通分量
    cogs1804 联合权值 dp
    cogs2478 简单的最近公共祖先 树形dp
    cogs1493 递推关系 矩阵
    cogs2557 天天爱跑步 LCA
    hdu4738 Caocao's Bridge Tarjan求割边
  • 原文地址:https://www.cnblogs.com/hider/p/15509427.html
Copyright © 2011-2022 走看看