Python从放弃到入门——生成式Comprehensions

前面介绍了Python核心的内置数据结构列表,元组,字典,集合。
除了前面介绍的方法与操作外,还有一种方式用于生成指定的列表,字典,集合等。这种操作叫做生成式,也叫推导(Comprehensions)。

列表生成式

列表生成式的格式如下:
L=[ x*x for x in range(5)]
列表推导看上去就像是一个反着写的for循环。把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来。
列表推导源自数学中集合的概念。它是一种通过对序列的每一项运行一个表达式来创建一个新列表的方法。

列表生成式可以加上if用于筛选出满足条件的元素。功能与filter函数类似。

列表生成式还可以使用双重循环进行全排列。

>>>L=[i*i for i in range(1,11)]
>>>print(L)
>>>L=[i*i for i in range(1,11) if i%2!=0]
>>>print(L)
>>>L=[(i,j) for i in range(1,4) for j in range(1,4)]
>>>print(L)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
[1, 9, 25, 49, 81]
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]

列表生成式还可以嵌套,用于完成矩阵转置等功能。

>>>matrix=[[1,2,3],[4,5,6],[7,8,9]]
>>>L=[[row[i] for row in matrix] for i in range(3)]
>>>print(L)
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

字典生成式

在for循环中并行迭代key和value,并将表达式包在{}中,就产生了字典生成式。
先来看一个简单的例子:

d={i:i*i for i in range(1,11)}
print(d)
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81, 10: 100}

如果存在两个列表,如何把两个列表组成字典呢?
同列表生成式一样,字典生成式也支持if语句以及双重循环。

items=['Fruits','Books','Others']
prices=[96,78,83]
d={item.upper():price for item,price in zip(items,prices)}
print(d)
{'FRUITS': 96, 'BOOKS': 78, 'OTHERS': 83}

d={item.upper():price for item,price in zip(items,prices) if price>80}
print(d)
{'FRUITS': 96, 'OTHERS': 83}

d={i:j for i in range(1,4) for j in range(1,4)}
print(d)
{1: 3, 2: 3, 3: 3}
#为什么生成的字典value全是3,下面是字典生成式的等价循环代码,每次迭代后内存循环的j都为3,因此会覆盖前面赋的value.
d={}
for i in range(1,4):
    for j in range(1,4):
        d[i]=j
print(d)

集合生成式

把字典生成式中的value去除后就产生了集合生成式。同样支持if语句与双重循环。

s={i*i for i in range(1,11)}
print(s)
{64, 1, 4, 36, 100, 9, 16, 49, 81, 25}

s={i*i for i in range(1,11) if i%2!=0}
print(s)
{1, 9, 81, 49, 25}

s={(i,j) for i in range(1,4) for j in range(1,4)}
print(s)
{(1, 2), (3, 2), (1, 3), (3, 3), (3, 1), (2, 1), (2, 3), (2, 2), (1, 1)}

生成式是一种比较抽象的表达式,如果嵌套的循环太多,判断条件太复杂会造成语句晦涩难懂。然而使用得当语句会非常精简酷炫。因此需要在追求代码的简洁性与易读性之间追求平衡。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值