吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1072|回复: 6
收起左侧

[学习记录] 列表推导式-Python

[复制链接]
甜萝 发表于 2023-3-8 19:23
本帖最后由 paypojie 于 2023-3-8 19:24 编辑

[Python] 纯文本查看 复制代码
# 列表推导式可以使用复杂的表达式和嵌套函数
from math import pi
print([str(round(pi,i)) for i in range(1,6)])

[Python] 纯文本查看 复制代码
# 普通的列表推导式
list1 = [x for x in range(10)]
print(list1)

[Python] 纯文本查看 复制代码
# 嵌套的列表推导式 
# 列表推导式中的初始推导式可以是任何表达式 甚至可以是另外的列表推导式
list2 = [[x for x in range(10)] for y in range(3)]
print(list2)

[Python] 纯文本查看 复制代码
# 现在 先定义一个3x4的矩阵 由三个长度为四的列表组成

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

# 用列表推导式将n里面所有的元素给遍历 items1和items2这两者保存的值是一样的是相等的
items1 = [row[i] for row in n for i in range(4)]
items2 = [i for row in n for i in row]
print(items1)
print(items2)
print(n)

[Python] 纯文本查看 复制代码
# 转置列表的行列 之前是 [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] 这种样子 现在变成这种 [[1,5,9],[2,6,10],[3,7,11],[4,8,12]] 样子
# 在 [row[i] for row in n for i in range(4)] 中 首先 for循环遍历行 然后遍历列所对应的索引 列表推导式生成的数字的顺序和原始列表的数字的顺序是一样的
# 我们遍历列表中的所有行的其中某一列 先用for循环遍历可迭代对象range 每次遍历可迭代对象range 变量i都会更新值 可迭代对象range的范围是列表中的行的长度 
# 然后再遍历行 每次遍历行 都会产生行中的某一列 也可以这样说 先遍历行中某一列所对应的索引 然后再遍历每一行 生成的值是每一行中的某一列 在列表推导式中 前面的
# 表达式基于后面的for循环求值 我们改写 [row[i] for row in n for i in range(4)] 使其变成 [[row[i] for row in n] for i in range(4)] 这样 就可以转置行列了
# 感觉有点难以表述 在n中 有3个列表 每个列表的长度为4 每个列表有4个元素 3个列表的元素数目是相等的 用for循环遍历range可迭代对象 使其产生的数字序列中的数字个数和
# 每个列表中的元素数目相同 而且可迭代对象range每次产生的数字对应列表中的某一列 for i in range(4)的前面是列表推导式 每次产生的列表 其值涵盖每一行中某一列 这个某一列是由i决定的

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

items1_1 = [[row[i] for row in n] for i in range(4)]
print(items1_1)

# 也可以这样写 
list1 = []
for i in range(4):
    list1.append([j[i] for j in n])
print(list1)

# 还可以这样写
list1 = []
for i in range(4):
    list2 = []
    for v in n:
        list2.append(v[i])
    list1.append(list2)

print(list1)

[Python] 纯文本查看 复制代码
n = [
    [1,2,3,4],
    [5,6,7,8],
    [9,10,11,12]
]

# Python官方文档应该是这样说的 在实际的应用中 最好用内置函数代替复杂的流程语句 所以在这里 我使用了zip()函数 来完成列表的转置
# zip()函数 将多个序列组成的可迭代对象作为参数 将序列中的元素按照对应的位置重新组合 打包成一个个的元组 然后返回由这些元组组成的列表 具体的返回值是一个对象地址
# *操作符用于将列表拆解 list()函数用于展开列表  
print(list((zip(*n))))

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

免费评分

参与人数 1吾爱币 +1 收起 理由
wapjluntan + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

52soft 发表于 2023-3-8 19:36
好好学习
吾爱支持 发表于 2023-3-9 08:05
感谢分享。老不用,又快全还回去了。。。看来三天不练真手生啊。
cyantea 发表于 2023-3-9 10:17
O2H2O 发表于 2023-3-9 10:55
看晕了,又复习了一遍,列表推导式相当于嵌套的for循环,但是转置那个案例还真挺难理解的
 楼主| 甜萝 发表于 2023-3-9 12:55
吾爱支持 发表于 2023-3-9 08:05
感谢分享。老不用,又快全还回去了。。。看来三天不练真手生啊。

这个确实
 楼主| 甜萝 发表于 2023-3-9 12:56
O2H2O 发表于 2023-3-9 10:55
看晕了,又复习了一遍,列表推导式相当于嵌套的for循环,但是转置那个案例还真挺难理解的

可能是转置那个我没讲好
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 00:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表