[expression for x in X [if condition] for y in Y [if condition] ... for n in N [if condition]]
执行顺序从左到右,从外到内。
如下所示,想从一个列表中获取大于0的值,首先想到的就是循环。
data = [-2, 4, -6, -4, 8, 19, -30]
res = []
for x in data:
if x >= 0:
res.append(x)
print(res)
# 输出 [4, 8, 19]
但是这样明显太臃肿了,语法不够简洁,可以尝试 【for in if】组合使用,对这个循环进行简化。
data = [-2, 4, -6, -4, 8, 19, -30]
res = [x for x in data if x >= 0]
print(res)
# 输出 [4, 8, 19]
获得一样的结果,代码只需要一行,是不是明显更简洁了。
同理,像最开始的语法展示一样,我们还可以嵌套多个 for 语句,如下所示:
res = [x + y for x in 'abc' for y in 'xyz']
print(res)
# ['ax', 'ay', 'az', 'bx', 'by', 'bz', 'cx', 'cy', 'cz']
python2.7之后还支持集合和字典的推导
# 在值不重复的情况下,我们可以通过字典推导式快速交换键值对
data = {'a':1, 'b':2, 'c':3}
res = {value: key for key, value in data.items()}
print(res)
# 结果 {1: 'a', 2: 'b', 3: 'c'}
用这种方式可以实现列表、集合、字典的推导,还可以在列表、字典、集合中快速筛选你需要的数据,下面再介绍一种列表的筛选方式,使用内置的filter函数,filter()函数接收一个函数 f 和一个序列,函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新的序列Iterator。
data = [-2, 4, -6, -4, 8, 19, -30]
res = filter(lambda x: x>=0, data)
print(res)
# <filter object at 0x000001BC246EC128>
# python3的filter返回时一个迭代器, 可以使用next逐个取出数据,取没了会抛出一个异常
# 也可以通过list构造器获取一个新的列表
res = list(res)
print(res)
# [4, 8, 19]
不推荐使用这种方式,要创建一个函数,并且比列表解析的方式稍微慢一点。