鱼C论坛

 找回密码
 立即注册
查看: 1137|回复: 0

[学习笔记] 零py-(ep-16)

[复制链接]
发表于 2023-9-17 17:13:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Nicole37 于 2023-9-17 17:13 编辑

列表推导式:
1、回顾:创建二维列表:
  1. a = [0]*3
  2. for i in range(3):
  3.     a[i]=[0]*3

  4.    
  5. a
  6. [[0, 0, 0], [0, 0, 0], [0, 0, 0]
复制代码

用嵌套列表得到该列表:
  1. a=[[0]*3 for i in range(3)]
  2. a
  3. [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
复制代码

2、有if分句的列表推导式:[expression for target in iterable if condition]
e.g
  1. #取出09之间的偶数
  2. even = [i for i in range(10) if i % 2 ==0]
  3. even
  4. [0, 2, 4, 6, 8]
复制代码

注意:该结构先执行 for语句,在执行if语句,最后执行左面输出表达式
e.g
  1. #输出其中首字母为w的单词
  2. words = ["what","do","you","want","to","eat","tomorrow"]
  3. w = [words[i] for i in range(len(words)) if words[i][0]=="w"]
  4. w
  5. ['what', 'want']
  6. #法2:别忘记列表本身可以直接被循环遍历
  7. w = [i for i in words if i[0]=='w']
  8. w
  9. ['what', 'want']
复制代码

3、列表推导式的嵌套:
[expression for i in b
                  for i in c
                    ..........
                  for i in d]
e.g
  1. #二维列表展开为一维:
  2. a = [[1,2,3],[4,5,6],[7,8,9]]
  3. b = [i for j in a for i in j]
  4. b
  5. [1, 2, 3, 4, 5, 6, 7, 8, 9]
  6. #先写外层循环 for j in a,在写内层嵌套循环for i in j
  7. #相当于下式
  8. b=[]
  9. for j in a:
  10.     for i in j:
  11.         b.append(i)
复制代码

e.g
  1. #对应项乘积
  2. [i+j for i in "honey" for j in "HONEY"]
  3. ['hH', 'hO', 'hN', 'hE', 'hY', 'oH', 'oO', 'oN', 'oE', 'oY', 'nH', 'nO', 'nN', 'nE', 'nY', 'eH', 'eO', 'eN', 'eE', 'eY', 'yH', 'yO', 'yN', 'yE', 'yY']
复制代码

3、终极列表推导式:
[expression for i in b if h
                  for i in c if v
                    ..........
                  for i in d if u]
e.g
注意:注意复杂的列表推导式是层层嵌套的,从左到右一级比一级高
  1. #输出(0-9)之间的组合,使得前者能被2整除,后者能被3整除
  2. a=[[i,j] for i in range(10) if i%2==0 for j in range(10) if j%3==0]
  3. a
  4. [[0, 0], [0, 3], [0, 6], [0, 9], [2, 0], [2, 3], [2, 6], [2, 9], [4, 0], [4, 3], [4, 6], [4, 9], [6, 0], [6, 3], [6, 6], [6, 9], [8, 0], [8, 3], [8, 6], [8, 9]]
  5. #_ 可以用于作为临时变量出现,等价于
  6. _=[]
  7. for i in range(10):
  8.     if i%2==0:
  9.         for j in range(10):
  10.             if j%3==0:
  11.                 _.append([i,j])
  12. _
  13. [[0, 0], [0, 3], [0, 6], [0, 9], [2, 0], [2, 3], [2, 6], [2, 9], [4, 0], [4, 3], [4, 6], [4, 9], [6, 0], [6, 3], [6, 6], [6, 9], [8, 0], [8, 3], [8, 6], [8, 9]]
复制代码

keep it simple & stupid~
作业:
1、请使用列表推导式创建一个 4 * 5 的二维列表,并将每个元素初始化为数字 8
  1. >>> s = [[8] * 5 for i in range(4)]
  2. >>> s
  3. [[8, 8, 8, 8, 8], [8, 8, 8, 8, 8], [8, 8, 8, 8, 8], [8, 8, 8, 8, 8]]
复制代码

4 * 5 就是 4 行 5 列,那么就是内层嵌套列表包含 5 个元素,外层列表包含 4 个嵌套列表的意思啦
2、请将下面 matrix 矩阵反向展开,即使得最终的结果为 [9, 8, 7, 6, 5, 4, 3, 2, 1]
  1. >>> matrix = [[1, 2, 3],
  2. ...           [4, 5, 6],
  3. ...           [7, 8, 9]]
  4. >>> flatten = [col for row in matrix for col in row][::-1]
  5. >>> flatten
  6. [9, 8, 7, 6, 5, 4, 3, 2, 1]
复制代码

先按顺序取出来,在用切片,从头到尾,-1表示倒着取

3、请使用列表推导式,获得 matrix 矩阵的转置矩阵 Tmatrix
  1. matrix = [[1, 2, 3, 4],
  2.           [5, 6, 7, 8],
  3.           [9, 10, 11, 12]]
  4. #循环版本
  5. x=[0]*4
  6. for a in range(4):
  7.     x[a]=[0]*3
  8.    
  9. for i in range(3):
  10.     for j in range(4):
  11.         x[j][i]=matrix[i][j]
复制代码

自己的答案,转置就是ij 变ji
注意:如果是反过来的就是-1 ,从9到2,以-1为间隔

评分

参与人数 1荣誉 +5 贡献 +3 收起 理由
歌者文明清理员 + 5 + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 06:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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