Python数据容器(组合数据类型)

Python数据容器

数据容器(组合数据类型)可以一次性存放多个数据,方便数据存储,提高效率

当需要批量存储或批量使用数据的时候,根据不同场景选用不同的组合数据类型

存储在该数据类型中的数据称为元素,每一个元素可以是任意类型数据

列表(list)

列表是一组有序项目的数据结构

列表的定义

基本语法:

  • [ ] 作为标识
  • 列表内每一个元素之间用","(逗号)隔开
# 字面量
[元素1,元素2,元素3,...]

# 定义变量
变量名称 = [元素1,元素2,元素3,...]

# 定义空列表
变量名称 = []
变量名称 = list()

列表可以一次存储多个数据,且可以为不同的数据类型支持嵌套

例子

name_list = ['Zhang3','Li4',['Zhang3','Li4'],6,True]
print(name_list)
print(type(name_list))

输出结果

['Zhang3', 'Li4', ['Zhang3', 'Li4'], 6, True]
<class 'list'>
列表的索引

列表中的每一个元素,都有其位置下标索引,从前向后的方向,从0开始,依次递增

语法:列表[下标索引]

例子

name_list = ['Zhang3','Li4',['Zhang3','Li4']]
print(name_list[0])	# 结果为 Zhang3
print(name_list[1]) # 结果为 Li4
print(name_list[2]) # 结果为 ['Zhang3','Li4']
print(name_list[2][0]) # 结果为 Zhang3

除了正向索引,Python还支持反向索引,也就是从后向前从-1开始,依次递减

例子

print(name_list[-1]) # 结果为 Zhang3
print(name_list[-2]) # 结果为 Li4
print(name_list[-3]) # 结果为 ['Zhang3','Li4']
print(name_list[-3][-2]) # 结果为 Zhang3
# 也可以花哨点,一个正向一个反向
print(name_list[-3][0]) # 结果为 Zhang3

在使用下标索引的时候,要注意不要超出范围,超出范围会报错

列表的方法

方法概述

编号使用方法作用
1列表.index(元素)查询某元素下标
2列表[下标]=值修改特定位置(索引)的元素值
3列表.insert(下标,元素)在指定的下标位置,插入指定的元素
4列表.append(元素)将指定元素,追加到列表的尾部
5列表.extend(其他数据容器)将其他数据容器的内容取出,依次追加到列表尾部
6del 列表[下标]/列表.pop(下标)删除指定下标的元素,pop()有返回值,可用变量接受
7列表.remove(元素)删除某元素在列表中的第一个匹配项
8列表.clear()清空列表内容
9列表.count(元素)统计某元素在列表中的数量
10len(列表)统计列表中全部元素的功能
查询

查找某元素的下标

功能:查找指定元素在列表的下标,如果找不到,报错ValueError

语法:列表.index(元素)

例子

my_list = ['nb','家人们谁懂啊','Nb']
index = my_list.index('nb')
print(f"nb在列表中的索引值是:{index}")  # 结果为 nb在列表中的索引值是:0
修改

修改特定位置(索引)的元素值

语法:列表[下标]=值

例子

my_list[1] = '111'	# 在Python中单引号和双引号都可以表示字符串,不过编译器输出默认是单引号
print(my_list)  # 结果为 ['nb','111','Nb']
插入元素

在指定的下标位置,插入指定的元素

语法:列表.insert(下标,元素)

例子

my_list.insert(1,666)
print(my_list)  # 结果为 ['nb',666,'111','Nb']
追加单个元素

将指定元素,追加到列表的尾部

语法:列表.append(元素)

例子

my_list.append("Hello")
print(my_list)  # 结果为 ['nb',666,'111','Nb','Hello']
追加一批元素

将其他数据容器的内容取出,依次追加到列表尾部

语法:列表.extend(其他数据容器)

例子

my_list2 = [1,2,3]
my_list.extend(my_list2)
print(my_list)	# 结果为 ['nb',666,'111','Nb','Hello',1,2,3]
删除元素(按下标删除)

删除指定下标的元素

语法1:del 列表[下标]

语法2:列表.pop(下标)

例子

my_list3 = ['a','b','c','d']
del my_list3[1]
print(my_list3)	# 结果为 ['a','c','d']
res = my_list3.pop(1)	# 结果为 ['a','d']
print(res)	# 结果为 c
删除元素(指定元素内容)

删除某元素在列表中的第一个匹配项

语法:列表.remove(元素)

my_list4 = ['a','b','c','a','a','b']
my_list4.remove('a')
print(my_list4)	# 结果为 ['b','c','a','a','b']
清空列表

清空列表内容

语法:列表.clear()

例子

my_list4.clear
print(my_list4)	# 结果为 []
统计某元素在列表中的数量

语法:列表.count(元素)

例子

my_list5 = [1,1,1,2,3,'1']
c = my_list5.count(1)
print(c)	# 结果为 3
统计列表中全部元素的功能

语法:len(列表)

例子

c = len(my_list5)
print(c)	# 结果为 6
列表的遍历

将容器内的元素依次取出进行处理的行为,称之为:遍历、迭代

while循环

利用列表的index(下标)作为循环条件

例子

index = 0
while index < len(列表):
    元素 = 列表[index]
    对元素进行处理
    index += 1
for循环

for循环会比while循环更适合对列表等数据容器进行遍历

语法:

for 临时变量 in 数据容器:
    对临时变量进行处理

表示从容器内依次取出元素并赋值到临时变量上

在每一次循环中,我们可以对临时变量(元素)进行处理

while循环和for循环的对比

while循环和for循环,都是循环语句,但细节不同:

  • 在循环控制上:
    • while循环可以自定循环条件,并自行控制
    • for循环不可以自定循环条件,只可以一个个从容器内取出数据
  • 在无限循环上:
    • while循环可以通过条件控制做到无限循环
    • for循环理论上不可以,因为被遍历的容器容量不是无限的
  • 在使用场景上:
    • while循环适用于任何想要循环的场景
    • for循环适用于,遍历数据容器的场景或简单的固定次数循环场景

元组(tuple)

元组最主要的特征就是——不可修改

可以看作一个只读的list列表

元组的定义

定义元组使用小括号,且使用逗号隔开各个数据,数据可以是不同的数据类型

# 字面量
(元素,元素,元素,...)
# 定义元组变量
变量名称 = (元素,元素,元素,...)
# 定义空元组
变量名称 = ()			# 方式1
变量名称 = tuple()		# 方式2

例子

t1 = (1,2,3,4,5,6,7,8)
t2 = ()
t3 = tuple()
print(f"t1的数据类型是:{type(t1)}")	# 结果为 t1的数据类型是:<class 'tuple'>

print(f"t2的数据类型是:{type(t2)}")	# 结果为 t2的数据类型是:<class 'tuple'>

print(f"t3的数据类型是:{type(t3)}")	# 结果为 t3的数据类型是:<class 'tuple'>

注意:定义1个元素的元组,这个数据后面要加逗号,不然就不是元组类型了

例子

t0 = ("hello")     
print(f"t0的数据类型是:{type(t0)}")	# 结果为 t0的数据类型是:<class 'str'>
t4 = ("hello",)     
print(f"t4的数据类型是:{type(t4)}")	# 结果为 t4的数据类型是:<class 'tuple'>

元组也可以嵌套,跟list列表嵌套方式一致

元组的操作

因为元组不可修改的特性,所以比列表操作少了很多,剩下的操作也与列表差不多

编号方法作用
1index()查找某个数据的索引
2count()统计元组内的某个元素个数
3len(元组)统计元组内的全部元素个数

例子

# 根据下标(索引)取出数据
t1 = (1,2,'hello')
print(t1[2])	# 结果为 'hello'

# 根据index(),查找特定元素的第一个匹配项
t1 = (1,2,'hello',3,4,'hello')
print(t1.index('hello'))	# 结果为 2

# 统计某个数据在元组内出现的次数
t1 = (1,2,'hello',3,4,'hello')
print(t1.count('hello'))	# 结果为 2

# 统计元组内的元素个数
t1 = (1,2,3,'hello')
print(len(t1))	# 结果为 4
元组的遍历

与list列表的操作一致,此处就不做详细说明

例子

# 元组的遍历
m = (1,2,3,4,5,6,7,8)
i = 0
print("while遍历")
while i < len(m):
    print(f"{m[i]}\t",end='')
    i += 1
print()
print("for遍历")
for i in m:
    print(f"{i}\t",end='')
print()
元组的注意事项

元组内的元素是不可以修改的,如果修改,会直接报错

但是如果元组里面嵌套了一个列表,这个列表是可以修改的

例子

my_tuple = (1,[1,2,3,4],6,7)
my_tuple[1][3]=999
print(my_tuple)		# 结果为 (1, [1, 2, 3, 999], 6, 7)

字符串(str)

字符串是字符的容器,一个字符串可以存放任意数量的字符

字符串的下标(索引)

和其它容器一样,字符串也可以通过下标进行访问

  • 从前向后,下标从0开始
  • 从后向前,下标从-1开始

例子

hobby = "唱跳rap篮球"
print(hobby[1])		# 结果为 跳
print(hobby[-3])	# 结果为 p

注意:同元组一样,字符串也是一个:无法修改的数据容器

字符串的常用操作
编号操作说明
1字符串[下标]取出指定下标的字符
2字符串.index(字符串)查找指定字符串的下标
3字符串.replace(字符串1,字符串2)将字符串内的全部字符串1换成字符串2
4字符串.split(字符串)按照指定字符串,对字符串进行切割
5字符串.strip()移除首尾的空格
6字符串.strip(字符串)移除首尾的指定字符
7字符串.count(字符串)统计某字符串出现的次数
8len(字符串)统计字符串长度
查找特定字符串的下标索引值

语法:字符串.index(字符串)

例子

my_str = "hello world,my friend"
print(my_str.index("my"))	# 结果为 12
字符串的替换

将字符串内的全部字符串1,替换为字符串2

注意不是修改字符串本身,而是得到一个新字符串

语法:字符串.replace(字符串1,字符串2)

例子

my_str = "hello world,my friend and my dear"
new_str = my_str.replace("my","your")
print(my_str)		# 结果为 hello world,my friend and my dear
print(new_str)		# 结果为 hello world,your friend and your dear
字符串的切割

按照指定的分隔符,将字符串分为多个字符串,并存入列表对象中

注意:字符串本身不变,得到了一个新的列表对象

语法:字符串.split(分隔符字符串)

例子

my_str = "hello world hello China"
res = my_str.split(" ")		# 以空格作为分隔符,进行切割
print(my_str)	# 结果为 hello world hello China
print(res)		# 结果为 ['hello','world','hello','China']	编译器一般输出的是单引号
字符串规整(去前后空格)

语法:字符串.strip()

例子

my_str = "   hello world  "
print(my_str.strip())		# 结果为 hello world
字符串规整(去前后字符串)

语法:字符串.strip(字符串)

my_str = "12hello 12world211212"
print(my_str.strip('12'))	# 结果为 hello 12world

注意:传入的**‘12’字符串,其实是’1’’2’**,会将这两个字符都删除,但是只会删除前后的,遇到这两个之外的,就会停止匹配删除

统计某字符串出现的次数

语法:字符串.count(需要统计的字符串)

与列表、元组的count使用一致

例子

my_str = "hello hello world my hello"
c = my_str.count('hello')
print(c)		# 结果为 3

注意:统计过的字符串不会重复计算

例子

str = "aaaaaaaaa"	# 9个a
print(str.count("aa"))	# 结果为 4
统计字符串的长度

语法:len(字符串)

与列表、元组的len()使用一致

例子

my_str = "hello hello world my hello"
print(len(my_str))		# 结果为 26

集合(set)

自带去重功能,且内容无序

集合的定义

基本语法:

# 定义集合字面量
{元素,元素,...,元素}		# 集合是无序的
# 定义集合变量
变量名称 = {元素,元素,...,元素}
# 定义空集合
变量名称 = set()

例子

my_set = {"hello","hello","a","b","c","d","hello"}
print(my_set)	# 结果为 {'d', 'b', 'c', 'a', 'hello'},去重,顺序打乱,元素是无序的

因为集合是无序的,所以集合不支持下标索引访问

集合的常用操作
添加新元素

将指定元素,添加到集合内

语法:集合.add(元素)

结果:集合本身被修改,添加了新元素,无序插入

例子

my_set = {"a","b","c","d","e"}
my_set.add("f")
print(my_set)		# 结果为 {'a', 'c', 'b', 'f', 'd', 'e'}
移除元素

将指定元素,从集合内移除

语法:集合.remove(元素)

结果:集合本身被修改,移除了元素

例子

my_set.remove("c")
print(my_set)		# 结果为 {'f', 'b', 'a', 'e', 'd'}
随机取出元素

从集合中随机取出一个元素

语法:集合.pop()

结果:会得到一个元素的结果。同时集合本身被修改,元素被移除

my_set = {"a","b","c","d","e"}
my_set.pop()
print(my_set)		# 结果为 {'e', 'c', 'a', 'b'}
清空集合

语法:集合.clear()

结果:集合本身被清空

my_set = {1,2,3,4,5}
my_set.clear()
print(my_set)		# 结果为 set()
集合的运算

直接使用运算符运算

运算符说明
s1 | s2 | s3 | …返回s1,s2,s3…的并集
s1 & s2 & s3 & …返回s1,s2,s3…的交集
s1 - s2 - s3 - …返回s1,s2,s3…的差集
s1 ^ s2返回s1,s2的对称差集
s1 == s2s1和s2的元素相同
s1 != s2s1和s2的元素不完全相同
s1 < s2s1是s2的真子集
s1 <= s2s1是s2的子集
s1 >= s2s1是s2的超集
s1 > s2s1是s2的纯超集

使用集合的方法进行运算

方法说明
s1.isdisjoint(s2)如果集合s1和s2没有共同元素,返回True,否则返回False
s1.issubset(s2)如果集合s1是s2的子集,返回True,否则返回False
s1.issuperset(s2)如果集合s1是s2的超集,返回True,否则返回False
s1.union(s2,…)返回s1,s2,…的并集
s1.intersection(s2,…)返回s1,s2,…的交集
s1.difference(s2,…)返回s1,s2,…的差集
s1.symmetric_difference(s2)返回s1和s2的对称差集
统计集合元素个数

语法:len(集合)

集合的遍历

因为集合不支持下标索引,所以不支持while循环遍历

for循环语法与前面的一致,都是for 临时变量 in 集合:

字典(dict)

字典最典型的特征就是:键值对

也就是:key :value

字典的定义

字典的定义,同样是使用{},不过存储的元素是一个个的键值对

语法:

# 定义字典的字面量
{key: value,key: value,...key: value}
# 定义字典变量
my_dict = {key: value,key: value,...key: value}
# 定义空字典
my_dict = {}			# 方式1
my_dict = dict()		# 方式2
字典数据的获取

字典同集合一样,不可以使用下标索引

但是字典可以通过Key值来取得对应的Value

所以Key值不可以重复,如果重复,会覆盖之前的Value

语法:

stu_score = {"张三": 100,"李四": 97,"王五": 99}
print(stu_score["张三"])		# 结果为 100
print(stu_score["李四"])		# 结果为 97
print(stu_score["王五"])		# 结果为 99
字典的嵌套

字典的Key和Value可以是任意数据类型(Key不可以为字典)

stu_score = {
    "张三": {
        "语文": 97,
        "数学": 96,
        "英语": 100},
    "李四": {
        "语文": 87,
        "数学": 86,
        "英语": 92},
    "王五": {
        "语文": 97,
        "数学": 96,
        "英语": 100}
}
print(stu_score)
# 结果为 {'张三': {'语文': 97, '数学': 96, '英语': 100}, '李四': {'语文': 87, '数学': 86, '英语': 92}, '王五': {'语文': 97, '数学': 96, '英语': 100}}

查找张三的语文成绩

print(stu_score["张三"]["语文"])	# 结果为 97
字典的常用操作
编号操作说明
1字典[Key]获取指定Key对应的Value
2字典[Key] = Value添加或更新键值对
3字典.pop(Key)取出指定Key对应的Value并在字典中删除该键值对
4字典.clear()清空字典
5字典.keys()获取字典全部的Key值,可用于for循环遍历字典
6len(字典)统计字典的元素个数
新增元素/更新元素

注意:因为字典的Key值不能重复,所以对已经存在的Key值进行新增操作,会覆盖原先的Value值,从而实现更新操作

语法:字典[Key] = Value

例子

my_dict = {'a': 1, 'b': 2, 'c': 3}
my_dict['d'] = 4
print(my_dict)		# 结果为 {'a': 1, 'b': 2, 'c': 3, 'd': 4}
my_dict['d'] = 999
print(my_dict)		# 结果为 {'a': 1, 'b': 2, 'c': 3, 'd': 999}
删除元素

获得指定Key的Value,同时字典被修改,指定Key的数据被删除

语法:变量 = 字典.pop(Key)

例子

my_dict = {'a': 1, 'b': 2, 'c': 3}
v = my_dict.pop('a')
print(my_dict)			# 结果为 {'b': 2, 'c': 3}
print(v)				# 结果为 1
清空元素

语法:字典.clear()

例子

my_dict = {'a': 1, 'b': 2, 'c': 3}
my_dict.clear()
print(my_dict)			# 结果为 {}
获取字典全部的Key

语法:字典.keys()

例子

my_dict = {'a': 1, 'b': 2, 'c': 3}
keys = my_dict.keys()
print(keys)				# 结果为 dict_keys(['a', 'b', 'c'])
字典的遍历

方式1:

通过keys()方法我们可以得到所有的Key值

于是我们可以通过遍历这些Key值,取出对应的Value

例子

for key in keys:
    print(key,end=' ')		# 加上end='空格'可以实现不换行输出	
    print(my_dict[key])
# 结果为 a 1
#		b 2
#		c 3

方式2:

直接对字典进行for循环,每一次循环都是直接得到Key

例子

for key in my_dict:
    print(key,end=' ')
    print(my_dict[key])
# 结果为 a 1
#		b 2
#		c 3
统计字典元素个数

语法:len(字典)

例子

my_dict = {'a': 1, 'b': 2, 'c': 3}
print(len(my_dict))			# 结果为 3

数据容器的通用操作

功能说明
通用for循环遍历容器(字典是遍历Key)
max()容器内元素最大值
min()容器内元素最小值
len()统计容器元素个数
list()转换为列表
tuple()转换为元组
str()转换为字符串
set()转换为集合
sorted(序列,[reverse=True])排序,如果reverse=False,表示升序

本次的Python数据容器就说到这啦,希望对大家有所帮助,数据容器的方法较多,记住常用的就好

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值