一、介绍
Python
中有个语法糖(syntactic sugar),就是 list comprehension
,即“列表推导式”。
同样适用于 dict
、set
等一系列可迭代的数据结构。
- 使用语法
out_list = [x for x in list if express_condition]
其中的 if
条件判断语句可有可无。
二、range函数
Python
中 range
函数可以用来创建一个整数列表,一般用在 for
循环中。
- 使用语法
range(start, stop, [, step])
start -- 开始
stop -- 结束(不包含)
setp -- 步长
列表推导式是通过一个可迭代对象来生成列表,range
是列表推导式中最常用的可迭代对象,是精髓之一。
三、实操
1.列表推导式
- 列表推导式会遍历可迭代对象,然后按照 for 前的表达式进行运算,生成最终的列表
- 如果有 if 条件语句, for 遍历后紧跟着进行条件判断
- 如果有多个 for 循环,则最终的数据数量为多个 for 循环的笛卡尔积
- 可以进行嵌套的列表推导,与嵌套 for 循环的原理相同
[x**2 for x in range(10)]
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[x**2 for x in range(10) if x > 5]
# [36, 49, 64, 81]
[x for x in range(10) if x % 2 == 0]
# [0, 2, 4, 6, 8]
[(x, x**2) for x in range(5)]
# [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16)]
dict([(x, x**2) for x in range(5)])
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
[(x, y) for x in range(10) if x % 2 if x > 3 for y in range(10) if y > 7 if y != 8]
# [(5, 9), (7, 9), (9, 9)]
a = [2,4,6]
b = [4,3,-9]
[a[i] + b[i] for i in range(len(a))]
# [6, 7, -3]
[x * y for x in [1,2,3] for y in [1,2,3]]
# [1, 2, 3, 2, 4, 6, 3, 6, 9]
li = [1,2,3,4]
def mul2(x):
return x*2
[mul2(i) for i in li]
# [2, 4, 6, 8]
# 嵌套循环 展平矩阵
matrix = [[1,2,3], [4,5,6], [7,8,9]]
[i for row in matrix for i in row]
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
2.字典(dict)和集合(set)推导式
- 将字典key和value互换
dic = {'a':10, 'b':20, 'c':30}
{value: key for key, value in dic.items()} # 返回键值对
# {10: 'a', 20: 'b', 30: 'c'}
- 提取首字母
words_list = ['apple', 'oppo', 'vivo', 'xiaomi']
set(w[0] for w in words_list)
# {'a', 'o', 'v', 'x'}
集合是无序且不重复的,会自动去掉重复的元素。
三、总结
总的来说,就是把普通的多行 for
循环压缩成一行代码。
这种压缩语法适用于列表、字典、集合等可迭代数据结构。
- 代码可读性 只需要一行代码
- 局部作用域 不存在变量泄露问题
- 尽量保持简洁
参考链接:Python的列表推导式
参考链接:Python中的列表推导式
参考链接:Python列表推导式