1.列表推导式

列表推导式提供了一个更简单的创建列表的方法。常见的用法是把某种操作应用于序列或可迭代对象的每个元素上,然后使用其结果来创建列表,或者通过满足某些特定条件元素来创建子序列。

例如,假设我们想创建一个平方列表,像这样

>>> squares = []
>>> for x in range(10):
...     squares.append(x**2)
...
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

注意这里创建(或被重写)的名为 x 的变量在for循环后仍然存在。我们可以计算平方列表的值而不会产生任何副作用

squares = list(map(lambda x: x**2, range(10)))

或者,等价于

squares = [x**2 for x in range(10)]

上面这种写法更加简洁易读。

Python列表推导式的结构是由一对方括号所包含的以下内容:一个表达式,后面跟一个 for 子句,然后是零个或多个 for或 if 子句。 其结果将是一个新列表,由对表达式依据后面的 for 和 if 子句的内容进行求值计算而得出。 举例来说,以下列表推导式会将两个列表中不相等的元素组合起来:

>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

而它等价于

>>> combs = []
>>> for x in [1,2,3]:
...     for y in [3,1,4]:
...         if x != y:
...             combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

注意在上面两个代码片段中, for 和 if 的顺序是相同的。

如果表达式是一个Python元组(例如上面的 (x, y)),那么就必须加上括号

>>> vec = [-4, -2, 0, 2, 4]
>>> # create a new list with the values doubled
>>> [x*2 for x in vec]
[-8, -4, 0, 4, 8]
>>> # filter the list to exclude negative numbers
>>> [x for x in vec if x >= 0]
[0, 2, 4]
>>> # apply a function to all the elements
>>> [abs(x) for x in vec]
[4, 2, 0, 2, 4]
>>> # call a method on each element
>>> freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']
>>> # create a list of 2-tuples like (number, square)
>>> [(x, x**2) for x in range(6)]
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
>>> # the tuple must be parenthesized, otherwise an error is raised
>>> [x, x**2 for x in range(6)]File "<stdin>", line 1, in <module>[x, x**2 for x in range(6)]^
SyntaxError: invalid syntax
>>> # flatten a list using a listcomp with two 'for'
>>> vec = [[1,2,3], [4,5,6], [7,8,9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

列表推导式可以使用复杂的表达式和嵌套函数

>>> from math import pi
>>> [str(round(pi, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']

2.嵌套的列表推导式

列表推导式中的初始表达式可以是任何表达式,包括另一个列表推导式。

考虑下面这个 3x4的矩阵,它由3个长度为4的列表组成

>>> matrix = [
...     [1, 2, 3, 4],
...     [5, 6, 7, 8],
...     [9, 10, 11, 12],
... ]

下面的列表推导式将交换其行和列

>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

如上节所示,嵌套的列表推导式是基于跟随其后的 for 进行求值的,所以这个例子等价于:

>>> transposed = []
>>> for i in range(4):
...     transposed.append([row[i] for row in matrix])
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

反过来说,也等价于

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> transposed = []
>>> for i in range(4):
...     # the following 3 lines implement the nested listcomp
...     transposed_row = []
...     for row in matrix:
...         transposed_row.append(row[i])
...     transposed.append(transposed_row)
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

实际应用中,你应该会更喜欢使用内置函数去组成复杂的流程语句。 zip() 函数将会很好地处理这种情况

>>> list(zip(*matrix))
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]

Python教程:列表推导式和嵌套的列表推导式讲解相关推荐

  1. python教程10-列表的基本使用、列表增加元素、列表的改查删、列表遍历

    python教程_小白入门10/2020/08/01 学习内容 文章目录 python教程_小白入门10/2020/08/01 P75 列表的基本使用 P76 列表增加元素 P77 列表的修改查询和删 ...

  2. Python教程:如何将list嵌套的list的[]去掉

    比如说 a = [[1,2,3], [5, 2, 8], [7,8,9]] 我们需要将里面的[]去掉,但是又不删除任意元素 如果list里里面的元素是数字,'1'也是可以的,那么我们可以使用np.ra ...

  3. 1.Python教程--基础篇(全)

    Python人工智能总目录 人工智能总目录网页链接 文章目录 Python人工智能总目录 1.Linux-基础 Day01笔记 1.1 开发简介 1. 三大操作系统 2. VMware Worksta ...

  4. python教程15-作业讲解、集合的使用、集合运算符的使用、eval和json的使用

    python教程_小白入门15/2020/8/26 学习目标 文章目录 python教程_小白入门15/2020/8/26 p102 作业讲解1 P103 作业讲解2 P104 集合的基本使用 P10 ...

  5. html列表小写字母,Html中的列表

    Html中列表共有三种:有序列表.无序列表和自定义列表.下面分开解释下: 1.有序列表是一列使用数字进行标记的项目,它使用 包含于 标签内.示例如下: 执行效果为:1.语文 2.数学 3.体育 4.英 ...

  6. Python各种推导式(列表推导式,字典推导式,集合推导式,嵌套列表推导式)

    一.列表推导式 Python官网列表推导式部分 列表推导式提供了一种创建list的简便方法.应用程序创建列表时,列表中的元素来源于其他序列.可迭代对象或创建的一个满足一定条件的序列. 基本格式: ​[ ...

  7. Python的列表推导式和嵌套列表推导式

    推导式 推导式的基本形式: [expr for val in Collection if condition] 简单翻译一下: [操作 for 值 in 容器 if 条件] strings = ['b ...

  8. python (八)迭代器、生成器、列表推导式

    一.迭代器 1.先来讲讲什么是可迭代对象 字符串.列表.元组.字典.集合都可以被for循环,说明他们都是可迭代的. 2.怎么判断是不是一个可迭代对象 判定方法:内部含有'__iter__'方法的数据就 ...

  9. python用列表推导式_python如何使用列表推导式

    python使用列表推导式的方法:1.用于使用其他列表创建一个新列表:2.可以对原列表进行变换和筛选:3.对多重嵌套的list进行变换筛选. python使用列表推导式的方法: python中列表推导 ...

最新文章

  1. NSURLProtectionSpace 证书认证的上下文
  2. HDFS以IO流的形式上传和下载文件案例
  3. Loadrunner压测时,出现的问题汇总
  4. python定义函数的组成部分有_Python基础11- 函数之自定义函数
  5. LeetCode之Construct the Rectangle
  6. 系统新模块增加需要哪些步骤_在1769系统里使用MVI69MCM的有福了
  7. gcc4.4下实现backtrace代码
  8. 【转】Asp.NET大文件上传组件开发总结(二)---提取文件内容
  9. numpy - np.reshape:将二维数组转变三维数组
  10. 操作系统及IIS版本选择参考
  11. CustomValidator控件用法
  12. 线程的同步互斥之事件对象(Event)
  13. FileOpen 及相关文件读写
  14. window10 删除桌面删除不掉的ie图标(快捷方式)
  15. linux下桌面快捷方式无法打开,亲测可用:Linux下桌面快捷方式创建实例
  16. pandas之表格条件格式设置
  17. 【月光博客】腾讯微信推出广告联盟
  18. 《炬丰科技-半导体工艺》石英深反应离子刻蚀特性研究
  19. flash build 4.6 不能debug 报错 C:\WINDOWS\system32\Macromed\Flash\NPSWF32.dll
  20. 怎么去学习绘画格子裙?该怎么画格子裙?

热门文章

  1. 2.安装 CLI和CLI的工作原理
  2. ***远程连接MYSQL提示1130 - Host is not allowed to connect to this MySQL server
  3. 初始化报表的应用用户
  4. 51,AVR,PIC,DSP,DIY等资源
  5. httpsendrequest的head怎么用string写_商品广告语用怎么写?男人篇
  6. VA02修改销售订单的BAPI举例
  7. [SAP ABAP开发技术总结]动态语句、动态程序
  8. ABAP面向对象的开发
  9. 更新Oracle的Date字段
  10. 此工作簿包含到其他数据源的链接