• 技术文章 >Python技术 >Python基础教程

    Python列表推导式(for表达式)及用法

    silencementsilencement2019-07-03 13:46:18原创4363

    for 表达式(列表推导式)用于利用其他区间、元组、列表等可迭代对象创建新的列表。

    for 表达式的语法格式如下:

    [表达式 for 循环计数器 in 可迭代对象]

    从上面的语法格式可以看出,for 表达式与普通 for 循环的区别有以下两点:

    在 for 关键字之前定义一个表达式,该表达式通常会包含循环计数器。

    for 表达式没有循环体,因此不需要冒号。

    for 表达式当然也是有循环的,它同样会对可迭代对象进行循环,可迭代对象包含几个对象,该循环就对 for 之前的“表达式”执行几次(相当于 for 之前的表达式就是循环体),并将每次执行的值收集起来作为新的列表元素。

    for 表达式最终返回的是列表,因此 for 表达式也被称为列表推导式。

    例如如下代码(程序一):

    a_range = range(10)
    # 对a_range执行for表达式
    a_list = [x * x for x in a_range]
    # a_list集合包含10个元素
    print(a_list)

    上面粗体字代码将会对 a_range 执行迭代,由于 a_range 相当于包含 10 个元素,因此程序生成的 a_list 同样包含 10 个元素,每个元素都是 a_range 中每个元素的平方(由表达式 x*x 控制)。

    运行上面代码,可以看到如下输出结果:

    [0 , 1 , 4 , 9 , 16 , 25 , 36 , 49 , 64, 81]

    还可以在 for 表达式后面添加 if 条件,这样 for 表达式将只迭代那些符合条件的元素。例如如下代码:

    b_list = [x * x for x in a_range if x % 2 == 0]
    # a_list集合包含5个元素
    print(b_list)

    第一行代码与程序一中第 3 行代码大致相同,只是为 for 表达式增加了 if 条件,这样程序只处理 range 区间的偶数,因此程序生成的 b_list 只包含 5 个元素。

    运行上面代码,可以看到如下输出结果:

    [0 ,4 , 16, 36, 64]

    如果将 for 表达式的方括号改为圆括号,for 表达式将不再生成列表,而是生成一个生成器(generator),该生成器同样可使用 for 循环选代。

    对于使用圆括号的 for 表达式,它最终返回的是生成器,因此这种 for 表达式也被称为生成器推导式。例如如下代码:

    # 使用for表达式创建生成器
    c_generator = (x * x for x in a_range if x % 2 == 0)
    # 使用for循环迭代生成器
    for i in c_generator:
        print(i, end='\t')
    print()

    程序中,第 2 行代码只是将 for 表达式的方括号改为圆括号,因此这行代码将会创建一个 generator 对象,接下来程序使用 for 循环遍历了该 generator 对象。运行上面程序,得到如下输出结果:

    0 4 16 36 64

    在前面看到的 for 表达式都只有一个循环,实际上 for 表达式可使用多个循环,就像嵌套循环一样。例如如下代码:

    d_list = [(x, y) for x in range(5) for y in range(4)]
    # d_list列表包含20个元素
    print(d_list)

    上面代码中 x 是遍历 range(5) 的计数器,因此该 x 可迭代 5 次;y 是遍历 range(4) 的计数器,因此该 y 可迭代 4 次。因此,该(x,y)表达式一共会迭代 20 次。

    运行上面代码,可以看到如下输出结果:

    [(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3), (3, 0), (3, 1), (3, 2), (3, 3), (4, 0), (4, 1), (4, 2), (4, 3)]

    上面的 for 表达式相当于如下嵌套循环:

    dd_list = []
    for x in range(5):
        for y in range(4):
            dd_list.append((x, y))

    当然,也支持类似于三层嵌套的 for 表达式,例如如下代码:

    e_list = [[x, y, z] for x in range(5) for y in range(4) for z in range(6)]
    # e_list列表包含120个元素
    print(e_list)

    对于包含多个循环的 for 表达式,同样可指定 if 条件。假如我们有一个需求:程序要将两个列表中的数值按“能否整除”的关系配对在一起。比如 src_a 列表中包含 30,src_b 列表中包含 5,其中 30 可以整除 5,那么就将 30 和 5 配对在一起。对于上面的需求使用 for 表达式来实现非常简单,例如如下代码:

    src_a = [30, 12, 66, 34, 39, 78, 36, 57, 121]
    src_b = [3, 5, 7, 11]
    # 只要y能整除x,就将它们配对在一起
    result = [(x, y) for x in src_b for y in src_a if y % x == 0]
    print(result)

    运行上面代码,可以看到如下输出结果:

    [(3, 30), (3, 12), (3, 66), (3, 39), (3, 78), (3, 36), (3, 57), (5, 30), (11, 66), (11, 121)]


    专题推荐:列表推导式
    品易云
    上一篇:Python如何把类当做字典来访问 下一篇:浅谈Python类命名空间

    相关文章推荐

    • Python之类方法、__new__方法和__init__方法介绍• python安装MongoDB

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网