# 列表推导式可以使用复杂的表达式和嵌套函数
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)