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

python列表推导式

语法规范:

out_list = [ out_express for out_express in input_list if out_express_condition]
列表推导式的速度非常快。如下两者都加了条件语句,但是列表推导式要比一般的循环语句快了 51%。

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

例:

# 从1到10所有偶数的平方
alist = []
for i in range(1, 11):
    if i % 2 == 0:
        alist.append(i * i)
print(alist)

# 列表推导式写法
blist = [i * i for i in range(1, 11) if i % 2 == 0]
print(blist)
输出结果
[4, 16, 36, 64, 100]
[4, 16, 36, 64, 100]

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

复杂的嵌套循环

我们先来看一个例子,把一个矩阵(以列表为元素的列表)展平为一个列表。首先,我们用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允许在中括号、花括号之间断行:

断行前:

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

断行后:

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

python字典推导式

myName = 'tinymeng'
dictionary = {}
for i in myName:
    dictionary[i] = 0
print(dictionary)

# 字典推导式写法
dictionary = {i:0 for i in myName}
print(dictionary)
输出结果
{'t': 0, 'i': 0, 'n': 0, 'y': 0, 'm': 0, 'e': 0, 'g': 0}
{'t': 0, 'i': 0, 'n': 0, 'y': 0, 'm': 0, 'e': 0, 'g': 0}
Last modification:December 5, 2019
如果觉得我的文章对你有用,请随意赞赏