嵌套列表(二维列表)

1.创建
  • 通过每个元素的值
matrix = [[1,2,3],[4,5,6],[7,8,9]]
martix = [[1,2,3],[4,5,6],[7,8,9]]

以上两种写法是等价的,第二种写法更加直观:

  • 通过循环语句创建和初始化二维列表
 A = [0] * 3for i in range(3):A[i] = [0] * 3


注意:不能通使用以下语句:

B = [[0] * 3] * 3


虽然看起来结果一样,但是这种写法在根本上就是错误的。我们修改A第二行第二列的元素,同时B也修改第二行第二列的元素。B明明只想改变一个元素,但事实上却改变了每一行的元素。

此处引入is运算符,表明Python对于不同对象的存储机制是不一样的。字符串给定了是不可变的,只需要在内存中开辟一个位置来存储就可以了;但是列表却是可变的,所以尽管两个列表内容一样,但是Python还是会开辟两个不同的位置来存储,因为他也不知道用户会在什么时候在列表中增加或者改变某个元素。

这里表明,A的第一、二、三行都存储在不同的位置,而B的第一、二、三行储存在了相同的位置。
到这里我们就可以明白B的问题在于试图通过乘号对一个嵌套列表进行拷贝,但其实他拷贝的只是一个列表的引用。

2.访问嵌套列表
  • 通过循环
for i in martix:for each in i:print(each)


对代码稍作改动,即内层循环每完成一次进行换行。

for i in martix:for each in i:print(each,end = ' ')print()

  • 通过下标
    这里只是得到了以行为单位的整个列表,而非嵌套列表中的元素。
martix[0]


为了访问列表中的元素,我们可以使用两次下标索引,第一个下标索引的是行,第二个下标索引的是列,例如索引第一行第一列:

martix[0][0]

3.列表推导式

如何将列表中的每一个元素的值都变成原来的二倍:

  • 我们可以考虑使用一个循环,利用下标索引来更新每一个元素的值。
oho = [1, 2, 3, 4, 5]
for i in range(len(oho)):oho[i] = oho[i] * 2

  • 如果使用列表推导式
    很明显这种方法更简略,列表推导式的效率通常是要比循环快上一倍左右的速度。这是因为列表推导式在Python解释器里是以更快的C语言的速度来运行的。
oho = [1, 2, 3, 4, 5]
oho = [i * 2 for i in oho]


基本语法:
[expression for target in iterable]
列表推导式的结果是一个列表,它相当于是使用一组数据来填充这个列表,所以需要用到一个for语句来配合,最后在for语句的左侧放一个表达式,经过运算最终决定存放在列表中的数据,例如:

  • 数字
x = [i for i in range(10)]

  • 字符
y = [c * 2 for c in "FishC"]

  • 如果想要每一个字符转换成Unicode编码并保存为列表:
code = [ord(c) for c in "FishC"]

这里ord()函数是将单个字符串转换为对应的编码

  • 如何通过列表推导式将矩阵第二列的元素提取出来:
matrix = [[1,2,3],[4,5,6],[7,8,9]]
col2 = [row[1] for row in matrix]
col2

  • 如何获取矩阵主对角线上的元素
diag = [matrix[i][i] for i in range(len(matrix))]


总结:
循环是通过迭代来逐个修改列表中的元素,而列表推导式则是直接创建了一个新的列表然后再赋值给原来的这个变量名。

带着判断条件的列表推导式
 s = [[0] * 3 for i in range(3)]


他会先执行for语句,再执行判断语句,最后输出最右边的值。

4.列表推导式的嵌套

语法如下

 [expression for target1 in iterable1for target2 in iterable2......for targetN in iterableN]
  • 将二维列表降级为一维列表
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flatten = [col for row in matrix for col in row]


将其转换为循环的实现就理解了,外层循环放在了前面,嵌套内层的循环放在了后面:

flatten = []
for row in matrix:for col in row:flatten.append(col)

  • 再来一个例子:
[x + y for x in "fishc" for y in "FISHC"]


在数学上可以理解为笛卡尔乘积

_ = []
for x in "fishc":for y in "FISHC":_.append(x + y)

5.列表推导式的终极语法:
 [expression for target1 in iterable1 if condition1for target2 in iterable2 if condition2......for targetN in iterableN if conditionN]

例如,x是0~9中能被2整除的数,即为偶数;y是能被3整除的数:

[[x, y] for x in range(10) if x % 2 == 0 for y in range(10) if y % 3 ==0]

将其转换为循环:

_ = []
for x in range(10):if x % 2 == 0:for y in range(10):if y % 3 == 0:_.append([x,y])


注意
非常重要的一个程序设计原则:KISS:Keep in Simple & Stupid

嵌套列表与列表推导式相关推荐

  1. python入门基础篇(三)序列切片,列表、元组推导式

    前面介绍了列表与元组,在这里补充一下关于列表.元组推导式,以及序列的切片.切片不仅仅用于列表元组,还可以用于字符串等等 文章目录 一.序列切片 二.列表推导式 1.根据列表生成指定需求的列表 2.生成 ...

  2. 高阶函数、列表/集合/字典/推导式、递归函数

    文章目录 高阶函数(map filter reduce sorted) map(处理数据) filter(过滤数据) reduce(计算数据) reduce(func,lst)实现的过程 sorted ...

  3. python列表切片和推导式思维导图_Python列表推导式使用

    列表推导式 列表推导式用来快速产生一个列表,主要有三种结构:基本结构,条件结构和多重循环(条件)结构 基本结构 语法: 列表 = [表达式 for 变量 in 序列 ] 含义: 变量每在序列中取一次值 ...

  4. PythonStudy——列表与字典推导式 List and dictionary derivation

    # 快速生成列表或字典的语法糖,且能在生成过程中添加简单的逻辑 # 能被列表推导式推导的数据源必须在循环取值时可以得到一个值 ls = [v for v in range(1, 6)] print(l ...

  5. (MAX第八篇)Python列表迭代及推导式(初级)

    目录 1. 迭代 for 循环 1.1 遍历`range()` 1.2 遍历列表 1.3 遍历字符串 2. 列表推导式 我们很多时候需要遍历整个列表,也就是说要使用列表中的每一个元素,则可以使用迭代f ...

  6. python列表解析式如何使用_python列表推导式操作解析

    python列表推导式操作解析 这篇文章主要介绍了python列表推导式操作解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 基本格式 ​[表达式 ...

  7. 列表推导式,Python中最好的特性?可读性?

    B站|公众号:啥都会一点的研究生 相关阅读 整理了几个100%会踩的Python细节坑,提前防止脑血栓 整理了十个100%提高效率的Python编程技巧,更上一层楼 Python-列表,从基础到进阶用 ...

  8. 列表推导式详解:[i for i in L]

    python的一般for循环:for i in x:#x是列表对象 而列表推导式是:[i for i in x] 其意为:用for i in x的所有遍历结果i来组成一个新的列表 1.列表推导式详解: ...

  9. Python:列表推导式、生成器、迭代器

    1. 列表推导式 列表推导式是通过旧的列表通过公式推导出新的列表 还有集合推导式.字典推导式,与列表推导式类似 格式为: [表达式 for 变量 in 旧列表] [表达式 for 变量 in 旧列表 ...

  10. Python笔记002-列表推导式

    Python笔记002-列表推导式 以下是我学习<流畅的Python>后的个人笔记,现在拿出来和大家共享,希望能帮到各位Python学习者. 首次发表于: 微信公众号:科技老丁哥,ID: ...

最新文章

  1. (C++)1016 部分A+B 正整数
  2. python学习笔记 day25 封装
  3. TPU3.0今日上岗!谷歌AI芯片甩竞争对手好几条街!
  4. 小程序swiper(tab)高度自适应
  5. python 调用支付宝微信接口_前端在h5页面调起微信支付接口和支付宝接口(日常笔记)...
  6. 组合模式源码解析(jdk+mybatis)
  7. 汇编语言程序开发过程
  8. 25个关键技术点,带你熟悉Python
  9. 华为云的“大招”——Euler开源 Gauss开放 旨在建立云生态
  10. python中常用的序列化模块_python 序列化,常用模块
  11. 2019最新k8s集群搭建教程 (centos k8s 搭建)
  12. (网页)JS实现alert中显示换行的方法
  13. Android 开机自启动应用
  14. @data注解_SpringBoot入门实践(七)-Spring-Data-JPA实现数据访问
  15. 蒟蒻的控制台贪吃蛇(新手实验)
  16. 【论文解读】MacBERT: 中文自然语言预训练模型
  17. 一张图,区分NPN于PNP型三极管的工作原理
  18. 计算机组成原理笔记(王道考研) 第二章:数据的表示和运算1
  19. mysql中图片的属性名是啥_数据库属性名
  20. 网络编程:网络协议简介

热门文章

  1. 骨传导耳机能保护听力吗?骨传导耳机是怎么传声的
  2. win10家庭版 遇到的问题
  3. 一段代码——使用rdkit函数生成分子文件的3D构象
  4. Oracle常用命令(一)
  5. 阿里巴巴2015秋季校园招聘研发工程师在线笔试题
  6. php实现指纹识别,CMS识别(Web指纹识别)扫描器开发
  7. pymsql模块详解
  8. 软件测试思想者 - “中华公网共图强”观后感
  9. 谈谈游戏中的帮派设计
  10. JAVA与海康威视人脸机对接,使用ISUP方式