列表生成式
先看一个例子:
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
|
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
|
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
|
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'}
|
元组生成式?
事实上不存在元组推导式,详情参看:刘江的博客教程:元组生成式?
其它参考:廖雪峰的官方网站:列表生成式