数据容器
数据容器
1. 数据容器是什么?
程序中如果要记录多个信息,如果一个个去定义变量会非常麻烦。数据容器就是用一个变量,记录多份数据。也就是可以批量存储和批量使用多份数据,类似于数组!
Python中的数据容器:一种可以容纳多份数据的数据类型,容纳的每一份数据称之为一个元素,每一个元素可以是任意类型的数据,比如字符串,数字,bool等等。
数据容器根据特点的不同,比如:
- 是否支持重复元素
- 是否可以修改
- 是否有序
- 等等
可以分为五类:列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict)。
2. list(列表)
2.1
基本语法:
1 | #字面量 |
- 列表中的每一个数据,称之为元素。元素类型可以为不同的数据类型,而且支持嵌套。
- 以[]作为标识。
- 列表内每一个元素之间用逗号隔开。
2.2列表的下标索引
通过下标索引取出列表里面特定位置的数据。
语法:
1 | 列表[下标索引] |
与c语言不同,列表的下标可以反向索引。比如最后一个元素的下标标记为-1,倒数第二的下标就是-2,以此类推。(就是你直接引用下标是-1的元素,结果就是最后一个元素。)
总之就是说,想取第一个元素,下标就给0,想取最后一个元素,如果在c语言不知道数组长度的话很麻烦,但是Python里面直接下标是-1取出来就是最后一个元素。
列表嵌套的下标索引:
举个例子:
列表[1][0]
意思就是指有一个列表,第二个元素也是列表,先取出这个列表的第二个元素也就是嵌套的列表,然后再取这个内层列表的第一个元素。写法类似于二维数组,但是含义是不一样的。
- 如果下标超出列表本身的大小范围就会报错。
2.3列表的常用操作方式
列表的方法(写在类(class)里面的函数就是方法):
- 插入元素
- 删除元素
- 清空列表
- 修改元素
- 统计元素个数
列表的查询功能(方法)
- 查找某个元素的下标。
功能:查找指定元素在列表的下标,如果找不到,报错ValueError
语法:
1 | 列表.index(元素) |
index就是列表对象(变量)内置的方法。
列表的修改功能(方法)
修改列表中的元素
语法:1
列表频[下标] = 值
向列表中指定位置插入元素
语法:1
列表.insert(下标,元素)
追加元素
- 将指定元素,追加到列表的尾部
语法:
1 | 列表.append(元素) |
如果要追加一批元素:
1 | 列表。extend(其他数据容器) |
- 将其他数据容器的内容取出,依次追加到列表尾部
删除元素
语法1:
1 | del 列表[下标] |
语法2:
1 | 列表.pop(下标) |
pop这个方法实际上是取出这个元素,并且返回,所以可以定义一个变量去接收这个被取出来的元素。
语法3:
- 不指定下标,而是指定元素的内容进行删除
- 从前到后去找这个元素,并且找到的第一个被删掉
1
列表.remove(元素)
清空列表
语法:
1 | 列表.clear() |
统计某个元素在列表内的数量
语法:
1 | count = 列表.count(元素) |
统计列表中总共有多少个元素
语法:
1 | count = len(列表) |
2.4 列表的特点
- 列表可以容纳多个元素(上限为2*63-1个)
- 可以容纳不同类型的元素(混装)
- 数据是有序存储的(有下标序号)
- 允许重复数据存在
- 可以修改(增加或删除元素等等)
2.5 列表的遍历
将容器内的元素依次取出进行处理的行为,称之为:遍历,迭代。
通过while、for循环来遍历列表的元素。
循环条件如何控制?
- 定义一个变量表示下标,这个变量从0开始。
- 循环的条件就是 下标值 < 列表的元素数量
for与while的区别:
- 循环控制上
- while循环可以自定义循环条件,自行控制。
- for不可以自定义循环条件,只可以一个个从容器内取出数据。
- 无限循环上
- while循环可以通过条件控制做到无限循环。
- for理论上是不可以实现无限循环,因为遍历的容器容量不是无限的。
- 在使用场景上:
- while循环适用于任何想要循环的场景。
- for循环适用于遍历数据容器的场景或者简单的固定次数循环的场景。
3.元组
3.1 元组的基本概念与定义
有了列表,为什么还需要元组?
- 因为列表是可以修改的,但是如果响应传递的信息,不被修改,列表就不合适了。
元组一旦定义完成,就不可修改。可以认为元组就是一个只读的list
所以元组应用于我们需要在程序内封装数据,但是又不希望数据被篡改。
定义语法:
1 | # 定义元组字面量 |
注意事项:
- 如果元组只有一个数据,这个数据后面也要添加括号。否则就不是元组类型了。
- 元组也可以嵌套(用法参考列表的嵌套)
- 如果print直接输出元组或者列表的话幂级数把里面的元素都打印出来。(加一个小括号或者中括号。反正就是元组或者列表怎么定义,就怎么打印)
3.2 元组的相关操作
由于元组的不可修改的特性,所以元组的相关操作没有列表那么多。
只有下面三种操作:
index()方法:查找某个数据,如果数据存在就返回对应的下标,否则报错。
count()方法,统计某个数据在当前元组出现的次数。
len(元组):统计元组内的元素个数。
特别注意:
元组不可以修改,但是如果元组里面嵌套一个list,这个list是可以修改的!
3.3元组的特点
可以容纳多个数据
可以容纳不同类型的数据(混装)
数据是有序存储的(下标索引)
允许重复数据存在
不可以修改(除非嵌套了list)
支持for循环
(多数特点和list一致。不同点在于不可修改的特性)
4. 再识字符串
字符串看上去并不像列表元组那样一看就是存放很多数据的容器。但是不可否认的是,字符串同样也是数据容器的一员。
字符串是字符的容器,一个字符串可以存放任意数量的字符。
- 字符串的下标索引和list、元组是一样的。
- 和元组一样,字符串是一个不可修改的数据容器。
字符串的方法:
index()方法
字符串.replace(字符串1,字符串2)。功能:将字符串内的全部:字符串1替换为字符串2。注意这里不是修改字符串本身,老的字符串不变,而是得到一个新的字符串,!
字符串.split(分隔符字符串)。功能:按照指定的分隔符字符串,将字符串划分为多个字符串,并存入列表对象。注意:字符串本身不变,而是得到一个列表对象的。这里的分隔符字符串是你自己定义的,可以是空格,也可以是每一个字符串片段。
字符串.strip。功能:字符串的规整操作,可以去掉前后空格。strip还可以再传入一个字符串作为参数,就可以去掉前后指定的字符串了。注意:如果参数写的是“12”,并不是只找12的字符串去删掉,而是,只要满足其中一个,也就是满足1或者满足2的我都去掉。
字符串.count(“指定的字符串”)方法,功能:统计字符串中指定字符串的出现次数。
len(字符串)。功能:统计字符串的字符个数。
字符串特点:
- 只可以存储字符串
- 长度任意
- 支持下标索引
- 允许重复字符串存在
- 不可以修改!
- 支持for循环
5.数据容器(序列)的切片操作
什么是序列?
- 序列是指:内容连续,有序,可以使用下标索引的一类数据容器。列表,元组,字符串均可以视为序列。
序列支持切片,也就是:列表,元组,字符串支持切片操作。
切片:从一个序列中,取出一个子序列。
语法:
1 | 序列[起始下标:结束下标:步长] |
表示:从序列中,从指定位置开始,依次取出元素,到指定位置结束,得到一个新序列。
起始下标表示从何处开始,可以留空,留空视作从头开始。
结束下标(不含)表示何处结束,可以留空,留空视作截取到结尾。
步长表示,依次取元素间隔。(步长1表示一个个取元素,步长2表示每次跳过一个元素取,步长N表示,每次跳过N-1个元素取。步长为负数表示,反向取(注意,起始下标和结束下标也要方向标记)
注意:
- 切片操作并不会影响序列本身,而是会得到新的序列。(因为元组和字符串都不能修改)
写法可以这样子:
1.先倒序字符串再切片取出:
result = my_strp[::-1][9:14]
- 先切片取出再倒序:
result = my_strp[5:10][::-1]
这个字符串的操作可以一连串写下来的。
举个例子:
result = my_str(“,”)[1].replace(“来”,””)[::1]
6. set(集合)
为什么还要集合?
列表、元组、字符串都支持元素重复并且有序。
集合最主要的特点就是不支持重复的元素内容,也就是自带去重功能。而且内容是无序的。
定义语法:
- 定义集合字面量
{元素,元素,……} - 定义集合变量
变量名称 = {变量,变量,……} - 定义空集合
变量名称 = set()
注意:
定义集合的时候,元素如果有重复的话,运行的话,程序并不会报错,但是重复的内容会自动去重,结果里面就不会重复了。
最后输出显示的时候并不会是定义时候的顺序,所以是乱序的。
因为集合是无序的,所以集合并不支持下标索引访问,集合的下标是没有意义的。所以集合不是序列!
但是集合和列表是一样的,是允许修改的。
集合的常用操作:
添加新的元素 : 集合.add(元素)。将指定元素,添加到集合内。
移除元素 : 集合.remove(元素),将指定元素,从集合内移除。
从集合中随机取出元素 : 集合.pop ,会得到一个元素的结果,同时集合本身被修改,元素被移除。
清空集合 : 集合.clear() 。
取出两个集合的差集 : 集合1.difference(集合2) 。功能:取出集合1有但是集合2没有的,得到一个新的集合,集合1和集合2不变。
消除两个集合的差集 : 集合1.difference_update(集合2) ,功能:在集合1内,删除和集合2相同的元素。结果:集合1被修改,集合2不变。
两个集合合并 , 集合1.union(集合2) ,功能:将集合1和集合2组合得到新的集合。 结果: 得到新集合,集合1和集合2不变。
统计集合元素数量 , len(集合)。如果元素重复了,按去重以后的数量计算得到结果。
因为集合不支持下标索引,所以不能用while循环!只能用for循环。
7.dict(字典)
类比于生活中的字典,生活中的字典通过’字’找到对应的‘含义’。
Python通过Key找到对应的Value
字典的定义:
- 定义字典字面量
{key:value,key:value,……}
定义字典变量
my_dick = {key:value,key:value,……}定义空字典
my_dick = {}
my_dick = dick()
字典的定义同样**使用{}**,不过存储的元素是一个个的: 键值对
Key肯定是不能重复的!因为要通过Key找到value,如果有两个一样的Key,那么用的是哪个value就不知道了。如果两个Key一样,代码不会报错,而是后面的Key的value会覆盖前面那个相同的key的value。
字典是通过key取得对应的value,所以,字典和集合一样,不可以使用下标索引。
使用上来说:
1 | 字典[key] |
就可以得到对应的value
字典的key和value可以是任意的数据类型,除了key不能是字典!
字典也是可以嵌套的。比如姓名作为key,考试成绩作为value,但是考试成绩有好几个科目啊,所以value也是可以作为字典。然后value作为字典,里面的key是语文数学等等科目,然后value是成绩。
从嵌套的字典里面取出value的写法也是类似于二维数组那个样子的。比如:字典[“陈鸣”][“语文”],取出来就是陈鸣的语文成绩。
字典的常用操作
新增元素:字典[key] = Value ,结果:字典被修改,新增了元素
更新元素: 字典[key] = value ,结果:字典被修改,元素被更新。
注意 :
- 字典的key不可以重复,所以对已经存在的key执行上述操作,就是更新value值。
- 如果是嵌套字典,可以直接把第一层的字典所包含的内容先赋值给一个新字典(相当于复制一份新的字典)。然后在这个新的字典上修改信息,最后再反向新的字典直接赋值给第一层字典。(虽然绕了点,但是告诉我们可以直接拿字典作为一个整体直接赋值过去)。
具体可以看黑马的Python
删除元素:字典pop(key) ,结果:会返回这个value,然后字典中的这个key和value都会被删除。
清空元素 :字典.clear
获取全部key :字典.keys() ,结果:获取字典中的全部key
统计字典的元素数量 : len(字典)
获取了全部的key有什么用呢?拿来遍历字典。或者也可以直接对字典进行for循环,每一次循环但是直接得到key。
字典不支持下标索引,所以不能用while循环。
8. 数据容器对比总结
简单的分类:
是否支持下标索引:
- 支持:列表,元组,字符串 —序列类型
- 不支持:集合,字典 —非序列类型
是否支持重复元素:
- 支持:列表,元组,字符串 —序列类型
- 不支持:集合,字典 —非序列类型
是否可以修改
- 支持:列表,集合,字典
不支持:元组,字符串
- 支持:列表,集合,字典
9. 数据容器的通用操作
数据容器尽管各有各的特点,但是它们也有通用的操作:
- 遍历:
- 5类数据容器都支持for循环遍历。
- 列表,元组,字符串支持while循环。集合,字典不支持(无法下标索引)
尽管遍历的形式各有不同,但是,他们都支持遍历。
- 通用的功能方法:
- len(容器) 统计容器的元素个数
- max(容器) 统计容器的最大元素
- min(容器) 统计容器的最新元素
(快捷键: shift + alt + 拖动鼠标 ,可以按列选中)
- 容器的通用转换功能:
转换的格式个之前学的数据类型的转换格式是一样的。
比如:
1 | list(容器) |
将给定的容器转换为列表。注意字符串转列表,是把字符串的每一个字符拿出来当做列表的每一个元素。字典转列表,列表中只存放字典的key。转元组同理。
其他类型转字符串的话,所有元素都可以保留。
转集合的话,记住会乱序并且去重。
字典转集合同样也是舍去了value,只留下了key。
能不能转字典?有这个转换函数,但是字典要的是键值对,所以有函数,但是你转不了。
- 容器通用排序功能:reverse默认是false,如果想要想要排序进行反转,那就第二个参数写一个reverse = True进去进行了。否则就不写就是默认参数。
1
sorted(容器,[reverse=True])
注意:
- 排序以后的结果都是列表对象!实际上就是对内容进行排序然后放到列表中。所以对字典进行排序,结果只有key,没有value了
10. 拓展:字符串比大小
字符串比较是基于数字的码值大小进行比较的(码值就是ASCII码表里面对应的值)
字符串是按位比较,也就是一位位进行对比,只要有一位大,那么整体就大。
- Title: 数据容器
- Author: CM
- Created at: 2023-07-16 11:13:15
- Updated at: 2023-07-21 20:04:45
- Link: https://redefine.ohevan.com/2023/07/16/数据容器/
- License: This work is licensed under CC BY-NC-SA 4.0.