第三章 序列
本章主要主要讲述什么是序列, 以及序列的几种类型: 列表, 元组, 字典, 集合等 熟悉相关概念以及操作方式(创建, 修改, 删除, 查询). 注意他们之间的使用区别并在不同情况下选取合适的序列
序列是一种数据存储方式,用来存储一系列的数据。 在内存中,序列就是一块用来存放多个值的连续的内存空间。
比如一个整数序列10,20,30,40,示意表示:
序列分类
序列可分为以下五类:
特别注意
序列类似Java中的集合的概念, 但是, 序列中的集合和Java中的集合却不一样 (约等于Java中的list 集合).
列表:用于存储任意数目、任意类型的数据集合。 列表是内置可变序列,是包含多个元素的有序连续的内存空间。 特点: 有序, 可变, 中括号**
[]
**
列表的标准语法格式:a = [10,20,30,40]
. 其中,10,20,30,40这些称为:列表a的元素。
注意:
列表的创建
列表的新增
+
运算符操作 ( 生成新对象 )列表的删除:
复制列表所有的元素到新列表对象:
访问:
计数:
列表的遍历:
列表常见方法如下图所示, 下面我们对部分用法进行操作
切片操作:
成员资格判断:
列表排序:
sort()
: 修改原列表,不建新列表的排序sort()
: 建新列表的排序reversed()
: 返回迭代器关于reversed()
我们打印输出c发现提示是:list_reverseiterator。也就是一个迭代对象。 同时,我们使用
list(c)
进行输出,发现只能使用一次。 第一次输出了元素,第二次为空。那是因为迭代对象在第一次时已经遍历结束了,第二次不能再使用。
max, min 和 sum
max, min用于返回列表中最大和最小值 sum 用于统计列表中各元素的和
二维列表
队名 | 第几季 | 胜者 |
---|---|---|
才子队 | 1 | 比尔 |
九头蛇队 | 2 | 皮尔斯 |
巨亨队 | 3 | 卡罗尔 |
二维表的访问方式:
列表属于可变序列,可以任意修改列表中的元素。 元组属于不可变序列,不能修改元组中的元素。 元组特点: 有序, 不可变, 小括号
( )
元组没有增加元素、修改元素、删除元素相关的方法。 只需学元组的创建和删除,元素的访问和计数即可。
元组支持如下操作:
元组的创建
tuple()可以接收列表、字符串、其他序列类型、迭代器等生成元组 list()可以接收元组、字符串、其他序列类型、迭代器等生成列表
元组的访问和计数
zip
zip(列表1,列表2,…)将多个列表对应位置的元素组合成为元组,并返回这个zip对象
生成器推导式创建元组
字典是“键值对”的无序可变序列,字典中的每个元素都是一个“键值对”,包含:“键对象”和“值对象”。 可以通过“键对象”实现快速获取、删除、更新对应的“值对象” 字典特点: 无序, 可变, 大括号
{}
+ 键值对k,v
字典是 Python 项目中最常用的序列类型之一, 对应Java 中常用的 Json 数据类型
字典的创建
元素的访问:
字典元素添加、修改、删除
序列解包
序列解包可以用于元组、列表、字典。序列解包可以让我们方便的对多个变量赋值
表格数据使用字典和列表存储访问
一 : 将一个键值对放进字典的底层过程
下面操作将一个键值对放入字典
假设字典a对象创建完后,数组长度为8
我们要把”name”=”比尔”这个键值对放到字典对象a中,
首先第一步需要计算键”name”的散列值。Python中可以通过hash()来计算。
下面我们通过 Python Console 来查看 name 的hash值
由于数组长度为8,我们可以拿计算出的散列值的最右边3位数字作为偏移量,即“101”,十进制是数字5。
我们查看偏移量6对应的bucket是否为空
如果为空,则将键值对放进去。如果不为空,则依次取右边3位作为偏移量,即“100”,十进制是数字4
再查看偏移量为7的bucket是否为空。直到找到为空的bucket将键值对放进去. 流程图如下:
字典扩容
python会根据散列表的拥挤程度扩容。“扩容”指的是:创造更大的数组,将原有内容拷贝到新数组中。
接近2/3时,数组就会扩容
二. 根据键查找“键值对”的底层过程
通过 Python console() 查看字典元素值如下
当调用a.get(“name”),就是根据键“name”查找到“键值对”,从而找到值对象“比尔”。
我们仍然要首先计算“name”对象的散列值:
和存储的底层流程算法一致,也是依次取散列值的不同位置的数字。
假设数组长度为8,我们可以拿计算出的散列值的最右边3位数字作为偏移量,即 101 ,十进制是数字5。
我们查看偏移量5,对应的 bucket 是否为空。如果为空,则返回 None 。
如果不为空,则将这个 bucket 的键对象计算对应散列值,和我们的散列值进行比较,
如果相等。则将对应“值对象”返回。
如果不相等,则再依次取其他几位数字,重新计算偏移量。依次取完后,仍然没有找到。则返回None 。
流程图如下:
用法总结:
__eq__()
方法检测相等性 (3) 若 a==b 为真,则 hash(a)==hash(b) 也为真集合: 集合是无序可变,元素不能重复 实际上,集合底层是字典实现,集合的所有元素都是字典中的“键对象”,因此是不能重复的且唯一的 集合特点: 无需, 可变, 大括号
{}
, 底层基于字典, 键不能重复
创建和删除
集合相关操作
根据上面的学习, 思考如下问题
name | season | winner |
---|---|---|
才子队 | 1 | 比尔 |
九头蛇队 | 2 | 皮尔斯 |
巨亨队 | 3 | 卡罗尔 |
name | season | winner |
---|---|---|
才子队 | 1 | 比尔 |
九头蛇队 | 2 | 皮尔斯 |
巨亨队 | 3 | 卡罗尔 |
答案
图1
图2