本文已参与「新人创作礼」活动,一起开启掘金创作之路。
python列表和字典的特征及应用
python学习手册(第四版)学习笔记(四) 第 8 章 列表与字典
列表
一、列表的特征
- 任意对象的有序集合;
- 通过偏移读取;
- 属于可变序列,也就是可以原地修改。这有别于字符串,字符串属于不可变序列,字符串不可以在原地修改。所以对序列的一些操作在这两者的某些地方不同;
- 可变长度、异构和嵌套 表8-1 常用列表常量与操作(p244) 更多课查阅python标准库手册;或者help(list)或dir(list)查看list方法
二、列表的操作
1、迭代和解析
涉及到的迭代和解析都与for有关。 所以推迟再讲 这一部分也是列表的更高级操作
2、索引、分片、矩阵
- 对列表的索引和分片与字符串相同,对列表进行分片返回一个新的列表;对字符串分片会生成一个新的对象
- 列表是可变序列,可以对其直接原地修改。而对于字符串这种不可变序列来说,需要建立一个新的拷贝(比如合并、切片)
- 原地修改的意思是:直接修改,不会生成一个新的列表作为结果
3、列表的方法调用
==python程序员更喜欢用的方式==
- help(list) 或 dir(list)来查看列表的方法
- python手册
- 《Python Pocket Reference》
字典
一、字典的性质
- 字典是可变的无序集合,而列表是有序集合
- 字典是通过键来存取,而列表通过偏移量
- 任意对象
- 可变长、异构、任意嵌套
- ==属于映射类型,这意味着不可以使用序列的操作(比如对字符串、列表等序列的操作)==
- 从本质上来收,字典是作为散列表来实现的。而对于列表来说,则是数组来实现
- 散列表是支持快速检索的数据结构
- 字典中键的顺序是随意的,这是为了可以快速查找 表8-2(p254)
二、字典的操作
1、原处修改
字典也是可变的,每当对字典键进行赋值(之前并没有被赋值的键),字典内就会生成一个新的元素。
2、方法调用
python库手册 help(dict)
3、字典用法注意事项
- 字典无法用一个简单的for语句来迭代。可以调用key方法,或者使用for语句打印键,再在for循环中嵌入dict[key]
- 序列运算无效,因为字典是 映射类型,是无序的。所以有序的序列运算没有用,并且会报错
- 键不一定总是字符串,任何不可变对象都可以
- 对于列表来说,对列表末尾外的偏移量赋值时会报错;而对字典的键赋值时(此键未被赋值)会产生新的键值对,而不会报错。说明字典比列表更灵活。如下:
- 如果想要应用列表或显示他们的值,则需要内置的list方法:
@TOC
基本内容
一、基本内容
基于字典的字符串格式化是普通的格式化高级版(下面统称格式化),普通的格式化就是类似于C语言中的 “ % ”
格式化代码样例如下:
其中format创建并返回一个新的字符串对象
相应的扩展请继续阅读
二、添加键、属性和偏移量
代码样例如下:
- 0和1代表的是format后面括号里的元素顺序,也即0表示sys;1表示字典{'spam':'laptop'};中间以逗号隔开。
- 方括号内是字典的索引值
- 对于列表来说,方括号内填得是偏移值
三、添加具体格式化
所谓具体格式化就是加入了“ :”
下面我们来介绍一下里面的内容:
- fieldname是指定参数的一个数字或关键字。后面的 “.name”是可选。例如 0.platform;
- ==formatspec指定了应该如何表示该值,此项比较重要,内容比较多,所以可实现的功能也比较多== 如下所示:
- <左对齐; >右对齐;^居中对齐; 字符宽度;浮点数精度;补位;进制数表示等等。比如:
{1:<10}表示:
分号前:format后括号里第二个元素;
分号后:此元素在一个10字符宽度的字段中左对齐;
{2:06.2f}表示:
分号前:不再赘述
分号后:06表示6个字符宽度的字段并且在左端补充0;.2f表示保留两个小数位的浮点数;
格式化和基于字典的格式化有许多共同点,但是基于字典的格式化处理更复杂的表达的时候更简单易读 当然重点是在实践中的具体需要。
为什么要分析引用与拷贝?这应该属于更底层的逻辑问题。
什么是引用,大家可以去看我的一篇博客: 《python中引用与C语言中的指针关系 》blog.csdn.net/m0_46672151…. ==1、在这里我大概介绍一下引用:== 在python中,你进行赋值操作,比如 a = 2; 然后你对a进行修改:a = 3; 此时你可能会觉得你修改了a的值,其实不然。在python内部中的逻辑:
- a是一个变量,变量是不会被修改的。
- 也就是说,变量a是在引用数值2。当你进行a = 3 的操作时,变量a重新引用数值3。以此类推,当你在进行赋值操作时,python进行的就是引用操作。而数值2、3就是python中常说的对象;
- 变量引用对象,python中有句话叫做万物皆对象。当你操作a = [1,2,3]时,也就是变量a引用列表对象
- python是用C语言写的,上面说的引用与C中的指针类似,可以说引用就是指针。
这就是引用的大概特征或者原理
2、那我们为什么会分析引用与拷贝呢? 前面说过赋值操作是储存对象的引用,所以它不是对这些对象的拷贝。 对于列表这类可变序列类型来说,比如:
X = [1,2,3]
Y = [1,X,3] #列表、字典均可任意嵌套
D = {'a':X,'b':1}
上面第一行代码对列表有一次引用,第二行第三行中都对列表X进行了引用。 此时列表X有三个引用,他们共享引用。所以列表中元素更改后,三个都会更改,也即X Y D中的元素都会改变。 所以在有些情况下我们不希望它改变,那么就要用到拷贝。
- 你可以使用分片操作来赋值:Y = X[ : ]
- copy方法
- copy模块
- 内置函数list(X)来生成拷贝 拷贝完赋值后,Y和D的赋值就会应用不同的列表而不是X,这时对X列表进行修改就不会影响Y和D。
==注意:== 分片和copy方法只能拷贝顶层,也即不能复制嵌套结构。若需要复制嵌套结构那么需要copy模块,也即 需要import copy;copy.deepcpoy().(关于深拷贝和浅拷贝问题)