列表解析的嵌套

前言

在CSDN上学习了这么久,学到了很多别人分享的知识,自己却还未写过一篇文章。自觉很惭愧,一直以来都在汲取,未曾回报。恰巧最近在学习Python,在学习之余,也要把知识分享给大家,今天就来开个头,分享一下自己对列表解析式的嵌套的理解,能帮助Python初学者更好理解列表解析。

列表解析式

列表解析式(List Comprehensions),又译为列表推导式,是自2000年PEP202引入的概念。简单来说,列表解析式提供了一种更简洁的方式来创建列表,语法是在列表中使用for循环和if语句来构造一个列表,结构是[表达式 for语句 if语句],表达式可以是任意类型的对象(包括一个列表解析式),返回一个新的列表。

列表解析式的执行顺序:各语句之间是类似for循环嵌套的关系,表达式是最后一层,第1个for循环是最外层,第2个for循环是往里一层,依次往里,直到执行最后的表达式。

下面是一个最普通的列表解析示例:

list=[i for i in range(10)]
print(list,type(list))

结果是:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'>

可见,list确实是一个列表。

如何更容易的理解呢?

其实,将上面的列表解析式用for循环来实现,将非常易于理解:

list=[]
for i in range(10):
    list.append(i)
print(list,type(list))

结果是:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'>

在for循环外创建一个空的列表list,每次循环都往list里增加一个数,效果就和列表解析一样。

for循环和if语句的列表解析式

列表解析式中可使用if语句作为过滤器来帮助我们构造列表,如筛选偶数作为list的元素:

list=[i for i in range(10) if not i%2]
print(list)

结果是:

[0, 2, 4, 6, 8]

同样可以使用for循环来实现:

list=[]
for i in range(10):
    if not i%2:
        list.append(i)
print(list)

多个for循环和if语句的列表解析式

列表解析式里可以包含多个for循环和多个if语句,执行顺序在开头已做介绍,表达式最后计算,从左往右是for循环的嵌套。

list=[x*y for x in range(1,10) if x > 7 for y in range(1,10) if y < 3]
print(list)

结果是:

[8, 16, 9, 18]

当然,同样可以使用for循环来实现:

list=[]
for x in range(1,10):
    if x > 7:
        for y in range(1,10):
            if y < 3:
                list.append(x*y)
print(list)

列表解析式中有更多的for循环时,执行顺序与上面相同。

列表解析式的嵌套

用一个典型的例子来说明列表解析式的嵌套。

matrix是一个3×4的矩阵列表,现将它矩阵转置一下得到4×3的矩阵列表,怎么写?

matrix = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
]
list = [[row[i] for row in matrix] for i in range(4)]
print(list)

结果是:

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

上面的例子中,表达式是一个列表解析式,即可返回一个元素是列表的列表。

当然,同样可以使用for循环来实现:

list = []
for i in range(4):
    list.append([row[i] for row in matrix])
print(list)

结果是:

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

将list.append()里面的列表解析式再拆出来,如下:

list = []
for i in range(4):
    l = []
    for row in matrix:
        l.append(row[i])
    list.append(l)
print(list)

结果是:

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

通过上面的例子,各位看官应该能明白列表解析式了。总之,列表解析式确实更方便构造列表。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sin-yee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值