列表推导式(List comprehensions)
通过列表推导式我们能更方便简洁地创建列表,一般是对序列(字符串、列表、元组)或者是可迭代对象(py3中range()返回就是可迭代对象)中的元素进行某些操作来生成新的列表。
假如我们想快速创建一个包含0到5的平方值的列表,我们可以:
squares = []
for x in range(6): #循环添加元素
squares.append(x**2)
print(squares) #[0, 1, 4, 9, 16, 25]
或者我们可以选择更简洁也更易读的方式:
squares = [x**2 for x in range(6)] #直接使用列表推导式
print(squares) #[0, 1, 4, 9, 16, 25]
当然,通过列表推导式我们还可以有更多操作:
vec = [-4, -2, 0, 2, 4] #创建一个列表
#筛选出vec列表中所有大于0的元素
print([x for x in vec if x > 0]) #[2, 4]
#对vec列表每个元素应用函数,此处为求绝对值
print([abs(x) for x in vec]) #[4, 2, 0, 2, 4]
#为列表每个元素调用方法,此处为转换字母小写
freshfruit = ['baNana', 'loGANberRY ', 'pAssiON fRUIT']
print([fruit.lower() for fruit in freshfruit])
#输出:['banana', 'loganberry ', 'passion fruit']
#生成两个列表中不相等元素可以组成的所有对的列表
print([(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)]
此外,我们还可以通过嵌套列表推导式来进行一些操作:
#构造一个二维列表模拟二维数组
matrix = [[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]]
#通过嵌套列表推导式来进行
print([ [row[i] for row in matrix] for i in range(len(matrix[0])) ])
#[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
总结:使用列表推导其实很简单,记住框架然后灵活使用即可。值得注意的是每个部分之间的的空格必不能少。
个人归纳的语法框架(仅供参考):[对单个元素的操作 for 单个元素 in 原始序列 if 筛选条件]
集合推导式
集合推导式和列表推导式极其相似,用法也完全一样,唯一的区别就在于将代表列表的符号[ ]替换成代表几个的符号{ }。
vec = [-4, -2, 0, 2, 4] #创建一个列表
#筛选出vec列表中所有大于0的元素,结果为列表
print([x for x in vec if x > 0]) #[2, 4]
#筛选出vec列表中所有大于0的元素,结果为集合
print({x for x in vec if x > 0}) #{2, 4}
#对vec列表每个元素求绝对值,结果为列表
print([abs(x) for x in vec]) #[4, 2, 0, 2, 4]
#对vec列表每个元素求绝对值,结果为集合
print({abs(x) for x in vec}) #{0, 2, 4} 注意此处的集合自动去重
总结:要注意的只有一点,使用集合推导式的返回结果会自动去重。
字典推导式
通过上面的介绍,大概可以猜出来字典推导式该怎么用了,直接来试试吧:
#生成以x为键,x平方为值的字典
print({x: x**2 for x in (2, 4, 6)})
#输出:{2: 4, 4: 16, 6: 36}
#快速将两个关联的列表以键值对的形式生成字典
names = ['trophy','jack','bob']
ages = [19,21,23]
print({name:age for (name, age) in zip(names,ages)})
#输出:{'trophy': 19, 'jack': 21, 'bob': 23}
参考:python官方文档(英文)