Python中的生成式(推导式)

列表生成式

先看一个例子:

1
2
3
4
5
6
# 测试
lis = [x * x for x in range(1, 10)]
print(lis)

# 输出
[1, 4, 9, 16, 25, 36, 49, 64, 81]

上面的一行语句等效于下面的 for 循环:

1
2
3
4
5
6
7
8
9
10
11
# 以上列表生成式具有下面的逻辑:
# 首先执行for循环,对于每一个x,计算(x * x)的值
# 将这些值按序添加到一个新列表lis当中
# 测试
lis = []
for i in range(1, 10):
lis.append(i * i)
print(lis)

# 输出
[1, 4, 9, 16, 25, 36, 49, 64, 81]

再来看看一些进阶用法:

  • for 后面使用 if 语句,表示筛选(过滤) x 的条件
1
2
3
4
5
6
7
# 只操作x<=5时的x
# 测试
lis = [x * x for x in range(1, 10) if x <= 5]
print(lis)

# 输出
[1, 4, 9, 16, 25]
  • for 前面使用 if 语句,表示改变生成新列表中值的方式
1
2
3
4
5
6
7
# 当x<=5时,计算x*x;当x>5时,计算x
# 测试
lis = [x * x if x<= 5 else x for x in range(1, 10)]
print(lis)

# 输出
[1, 4, 9, 16, 25, 6, 7, 8, 9]
  • 使用多层 for 循环(和单层循环是一个意思, 3 层及 3 层以上的循环在生成式(推导式)中就用得比较少了)
1
2
3
4
5
6
# 测试
lis = [x * y for x in range(1, 4) for y in range(1, 4)]
print(lis)

# 输出
[1, 2, 3, 2, 4, 6, 3, 6, 9]
  • 使用多个变量来生成列表
1
2
3
4
5
6
# 测试
lis = [a+b+c for a in "p" for b in "i" for c in "g"]
print(lis)

# 输出
['pig']

字典生成式

个人感觉这个没有列表生成式实用,但还是了解一下:

1
2
3
4
5
6
# 测试
dic = {x : y * y for x, y in [("pig", 1), ("dog", 2), ("cat", 3)]}
print(dic)

# 输出
{'pig': 1, 'dog': 4, 'cat': 9}

集合生成式

1
2
3
4
5
6
7
8
# 注意,集合是无序不重复的
# 相比于字典,没有键-值对结构
# 测试
a = {x for x in "abracadabra" if x not in "abc"}
print(a)

# 输出
{'r', 'd'}

元组生成式?

事实上不存在元组推导式,详情参看:刘江的博客教程:元组生成式?

其它参考:廖雪峰的官方网站:列表生成式