Python基础列之表生成式

640?wx_fmt=gif

List comprehensions provide a concise way to create lists. Common applications are to make new lists where each element is the result of some operations applied to each member of another sequence or iterable, or to create a subsequence of those elements that satisfy a certain condition.


列表生成式(List Comprehensions)是Python基础,好用,而又非常重要的功能,也是最受欢迎的Python特性之一,可以说掌握它是成为合格Python程序员的基本标准。本质上可以把列表推导式理解成一种集合了变换和筛选功能的函数,通过这个函数把一个列表转换成另一个列表。注意是另一个新列表,原列表保持不变。


首先我们来瞧一行列表的代码:

>>> squares = []

>>> for x in range(10):

squares.append(x**2)
输出:
>>> squares

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

对于以上这串代码,我们还可以这么去写:

squares = [x**2 for x in range(10)]
输出:
>>> squares

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

两者都能生成一样的结果,为什么第二种方法就能很方便,一行就搞定了?

这就是 列表生成式(也叫列表推导式,List Comprehensions)!




(1)对列表中的每项元素进行立方运算(变换功能)


a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = [x ** 3 for x in a if x % 2 == 0]
print(b)
[8, 64, 216, 512, 1000]

       从结果上可以看出有筛选条件的话是先筛选再变换,即先筛掉不满足条件的元素,再进行变换运算。可以同时加多个筛选条件,如对大于5的且是偶数的元素进行立方运算,示例如下:

 
 
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = [x ** 3 for x in a if x % 2 == 0 if x > 5]
print(b)
[216, 512, 1000]

(2)与zip结合

       将a,b两个列表中相对应得值组合起来,形成一个新列表。例如包含x坐标的列表与y坐标的列表形成相对应的点坐标[x, y]列表。

 
 
a = [-1, -2, -3, -4, -5, -6, -7, -8, -9, -10]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
xy = [[x, y] for x, y in zip(a, b)]
print(xy)
[[-1, 1], [-2, 2], [-3, 3], [-4, 4], [-5, 5], [-6, 6], [-7, 7], [-8, 8], [-9, 9], [-10, 10]]

(3)支持多层for循环

       将一个嵌套列表转换成一个一维列表。

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = [j for i in a for j in i]
print(b)

[1, 2, 3, 4, 5, 6, 7, 8, 9]

 

注意事项 :
1. 当需要只是执行一个循环的时候尽量使用循环而不是列表解析, 这样更符合python提倡的直观性:

for item in sequence: 
    process(item)

2. 当有内建的操作或者类型能够以更直接的方式实现的, 不要使用列表解析. 
例如复制一个列表时, 使用; L1=list(L) 即可, 不必使用: L1=[x for x in L]

3. 如果需要对每个元素都调用并且返回结果时, 应使用 L1=map(f,L), 而不是 L1=[f(x) for x in L].

4. 如果表达式是一个元组(例如前面示例中的(x, y)),它必须是圆括号。

>>> # create a list of 2-tuples like (number, square)
>>> [(x, x**2) for x in range(6)]

输出:
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]

5.列表理解可以包含复杂的表达式和嵌套函数:

>>> from math import pi
>>> [str(round(pi, i)) for i in range(1, 6)]

输出:
['3.1', '3.14', '3.142', '3.1416', '3.14159']



       列表生成式的使用非常广泛,从实际使用经验来看,列表生成式使用的频率是非常高的,也是相当好用的。而对于列表推导式的多层for循环,尤其是3层以上的或带复杂筛选条件的,牺牲了较多的可读性,直接用多个普通for循环方式实现就可以了。









640?wx_fmt=jpeg


听说有气质的人都会关注这个公众号!

640?wx_fmt=jpeg


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值