Python 知识点: 列表推导式(list comprehension)

简介: Python里面有个很棒的语法糖(syntactic sugar),它就是 list comprehension ,有人把它翻译成“列表推导式”,也有人翻译成“列表解析式”。名字听上去很难理解,但是看它的语法就很清晰了。

QQ_20190315095359

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技术文章优先发布在我的个人博客:猿人学
公众号:猿人学Pyhton

目录
相关文章
|
2月前
|
开发者 Python
Python列表推导式:优雅与效率的完美融合
Python列表推导式:优雅与效率的完美融合
319 104
|
2月前
|
Python
Python列表推导式:优雅与效率的艺术
Python列表推导式:优雅与效率的艺术
253 99
|
2月前
|
数据处理 Python
解锁Python列表推导式:优雅与效率的完美融合
解锁Python列表推导式:优雅与效率的完美融合
265 99
|
2月前
|
开发者 Python
Python列表推导式:一行代码的艺术与力量
Python列表推导式:一行代码的艺术与力量
388 95
|
3月前
|
开发者 Python
Python神技:用列表推导式让你的代码更优雅
Python神技:用列表推导式让你的代码更优雅
437 99
|
3月前
|
程序员 Python
Python列表推导式:简洁与高效的艺术
Python列表推导式:简洁与高效的艺术
279 99
|
2月前
|
存储 Java 索引
(Python基础)新时代语言!一起学习Python吧!(二):字符编码由来;Python字符串、字符串格式化;list集合和tuple元组区别
字符编码 我们要清楚,计算机最开始的表达都是由二进制而来 我们要想通过二进制来表示我们熟知的字符看看以下的变化 例如: 1 的二进制编码为 0000 0001 我们通过A这个字符,让其在计算机内部存储(现如今,A 字符在地址通常表示为65) 现在拿A举例: 在计算机内部 A字符,它本身表示为 65这个数,在计算机底层会转为二进制码 也意味着A字符在底层表示为 1000001 通过这样的字符表示进行转换,逐步发展为拥有127个字符的编码存储到计算机中,这个编码表也被称为ASCII编码。 但随时代变迁,ASCII编码逐渐暴露短板,全球有上百种语言,光是ASCII编码并不能够满足需求
156 4
|
6月前
|
测试技术 数据处理 Python
Python列表推导式:简洁高效的数据处理利器
Python列表推导式:简洁高效的数据处理利器
335 80
|
4月前
|
安全 测试技术 数据处理
Python列表推导式进阶:从简洁代码到高效编程的10个核心技巧
列表推导式是Python中高效的数据处理工具,能将多行循环代码压缩为一行,提升代码可读性与执行效率。本文详解其基础语法、嵌套循环、条件表达式、函数融合、性能优化等进阶技巧,并结合实战案例与边界条件处理,帮助开发者写出更优雅、高效的Python代码。
282 0

推荐镜像

更多