Python里面有个很棒的语法糖(syntactic sugar),它就是 list comprehension ,有人把它翻译成“列表推导式”,也有人翻译成“列表解析式”。名字听上去很难理解,但是看它的语法就很清晰了。虽然名字叫做 list comprehension,但是这个语法同样适用于dict、set等这一系列可迭代(iterable)数据结构。

语法规范:

out_list = [out_express for out_express in input_list if out_express_condition]

其中的 if 条件判断根据需要可有可无。

下面看一个具体的例子,生成一个包含10以内的偶数的list:

In [1]: evens = [i for i in range(10) if i % 2 == 0]
In [2]: evens
Out[2]: [0, 2, 4, 6, 8]
 

由for循环升级到列表推导式:

在没有了解list comprehension之前,上面那个生成偶数list的通常做法是用for循环:

evens = []
for i in range(10):
if i % 2 == 0:
evens.append(i)

很明显,for循环占用了4行代码,而 list comprehension 只用了1行代码。

文章开始说到推导式的语法规范时,我们讲了if表达式是可有可无的,这也符合我们编程遇到的实际情况。比如,要生成一个10以内的整数的平方的列表:

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

复杂的嵌套循环

我们先来看一个例子,把一个矩阵(以列表为元素的列表)展平为一个列表。首先,我们用for循环来实现一下:

matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
] flattened = [] for row in matrix:
for i in row:
flattened.append(i)

接着我们用列表推导式实现该功能:

flattened = [i for row in matrix for i in row]

还是一行代码就搞定,但一行里面有两个for,看起来很乱,两个for,哪个在前哪个在后呢?只要记住他们的顺序和不用推导式的原始for循环是一致的即可。

推导式的可读性

一行代码搞定几行代码的事情,看上去很简洁,但是读起来很费劲,尤其是当条件语句很长的时候,把这一行代码变得很长,超过了代码规范规定的长度(一般是80个字符),也使得理解代码变得困难。

面对一行长长的代码该如何下口读,如何理解呢?别着急,好在Python允许在中括号、花括号之间断行:

列表推导式的断行:

断行前:

evens = [i for i in range(10) if i % 2 == 0]

断行后:

evens = [
i
for i in range(10)
if i % 2 == 0
]

带嵌套循环的推导式的断行:

断行前:

flattened = [i for row in matrix for i in row]

断行后:

flattened = [
i
for row in matrix
for i in row
]

字典(dict)和集合(set)的推导式:

前面我们也提到过,推导式不仅仅适用于列表,它同样使用于字典dict和集合set。

把一个字典的key和value互换:

changed = {value: key for key, value in input_dict.items()}

用一个列表的所有单词的首字母生成一个集合:

chars = {w[0] for w in words_list}

通过以上讲解就可以轻松掌握Python的列表推导式(list comprehension)了,简而言之,就是把普通的多行for循环压缩成一行代码,这种压缩语法适用于列表、字典、集合等可迭代数据结构(iterables)。

文章首发于我的技术博客猿人学Python基础教程

最新文章

  1. jdbc mysql写入中文乱码解决
  2. android studio 插件
  3. 【python】*与** 参数问题
  4. [Tex学习笔记]一个数学公式
  5. Rhino Mock
  6. 为什么会出现ADB rejected shell command
  7. jquery之音乐均衡器
  8. 学习之spring属性文件注入
  9. LoadRunner_Analysis(z) 分析
  10. mysql出现Waiting for table metadata lock的原因及解决方案
  11. 文件比较,文件夹比较-- vimdiff,beyond compare, compare suite, WinMerge,Kdiff3
  12. 阿里云服务器Windows Server 2008/2012部署Office Web Server 2013
  13. Spring+JUnit4单元测试入门
  14. 运行java web项目时报错:Several ports (8005, 8080, 8009) required
  15. app自动化问题点整理
  16. css设置垂直居中方式总结
  17. ubuntu linux下建立stm32开发环境: 程序烧录 openocd+openjtag
  18. 【batch】批处理文件多参数处理和for循环字符串连接
  19. SpringData分页功能
  20. centos7安装zabbix3.0超详细步骤解析

热门文章

  1. django安装使用xadmin
  2. java-统计一段句子中各单词出现的次数
  3. 通过python批量修改mp3名称
  4. 12 Cookie、Session和JSP基础
  5. React路由传参的三种方式
  6. 05- if-else语句、循环for
  7. docker (二):容器container
  8. Java性能优化学习笔记
  9. Linux用户组笔记整理
  10. c#部分类