前面关于python的下载安装、如何定义变量,基本的数据类型,以及if条件语句、for循环语句,部分运算都进行了梳理总结。参考:Python 3 入门基础知识【1】数据类型 安装下载 推荐-CSDN博客
这里回顾一下python的数据容器基础知识,包括list容器、tuple、dict和set容器,以及他们的用法和区别特点,以便自己查看,欢迎正在学习python的同学参考,有问题评论区交流,谢谢。
目录
一.python中的容器
1.list 容器
1.1 list定义
1.2 for循环按照顺便访问list
1.3 索引访问
1.4 倒序访问
1.5 向list添加新元素
1.6 从list删除元素
1.7 替换list元素
1.8 二维数组
2.tuple容器
2.1 定义及访问
2.2 访问tuple元素的方法
2.3 创建单个元素的tuple
2.4 可变tuple
3.dict容器
3.1 定义dict容器
3.2 读取dict数据
3.3 添加元素
3.4 更新dict元素
3.5 删除dict元素
3.6 dict的特点
3.7 操作dict的其他方法
4.set容器
4.1 读取set元素
4.2 添加元素
4.3 删除元素 remove()
4.4 操作set的其他方法
一.python中的容器
在程序中,容器是一种可以把多个元素放在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in等关键字判断某个元素是否包含在容器中。在Python中,包括列表(list)、元组(tuple)、字典(dict)、集合(set)等,他们都可以放入多个元素,因此都可以算作是容器,这些容器是Python编程中非常重要的数据结构。
1.list 容器
1.1 list定义
列表(list)是一种有序的容器,放入list中的元素,将会按照一定顺序排列。构造list的方法非常简单,使用中括号[]
把需要放在容器里面的元素括起来,就定义了一个列表
1.2 for循环按照顺便访问list
1.3 索引访问
我们通过中括号[]
来按位置访问对应的元素
names = ['Alice', 'Bob', 'David', 'Ellena']
print(names[0]) #Alice
print(names[4]) #超出索引会报错的
#报错如下
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
也支持切片访问,切片访问超出索引不会报错,但是会取不到任何元素
names = ['Alice', 'Bob', 'David', 'Ellena']
sub_names = names[0:2]
print(sub_names)
#切片访问超出索引不会报错,但是会取不到任何元素
sub_names = names[5:10]
print(sub_names) # ==> []
1.4 倒序访问
倒序访问越界也会报错,代码如下:
names = ['Alice', 'Bob', 'David', 'Ellena']
print(names[-1]) #Ellena
#越界也会报错
print(names[-5])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
1.5 向list添加新元素
有两种方法
- 第一个办法是用
append()
方法,默认把数据添加到列表的末尾; - 第二insert()方法需要两个参数,分别是需要插入的位置,以及需要插入的元素。
names = ['Alice', 'Bob', 'David', 'Ellena']
names.append('Candy') # ['Alice', 'Bob', 'David', 'Ellena', 'Candy']
names.insert(2, 'Candy') #['Alice', 'Bob', 'Candy', 'David', 'Ellena']
1.6 从list删除元素
使用列表的pop()方法,pop()方法默认删除列表的最后一个元素,并返回
L = ['Alice', 'Bob', 'Candy', 'David', 'Ellena']
name = L.pop() #默认删除list列表的最后一个元素 ellena
name = L.pop(2) #指定删除index是2 的元素 即candy
1.7 替换list元素
L = ['Alice', 'Bob', 'Candy', 'David', 'Ellena']
L[2] = 'Canlina'
L[-3] = 'Canlina'
# 如果替换不存在的下标也会报错的
L[6] = 'Canlina'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
1.8 二维数组
alice_scores = [100, 89, 92]
bob_scores = [70, 65, 81]
candy_scores = [88, 72, 77]
all_scores = [alice_scores, bob_scores, candy_scores]
2.tuple容器
元组(tuple)和list一样,也是一个有序容器,在元组中,同样可以包含0个或者多个元素,并且也支持索引访问、切片等操作。
定义元组的方式是使用小括号()
将元组内的元素括起来。
2.1 定义及访问
T = ('Alice', 'Bob', 'Candy', 'David', 'Ellena')
# 通过下标的方式访问元素
print(T[0]) # ==> Alice
# 切片
print(T[1:3]) # ==> ('Bob', 'Candy')
数据转换 可以把不是元组的容器转换为元组,比如将列表转换成元组,也可以把元组转换成列表
# list列表数据转换成元组类型
L = ['Alice', 'Bob', 'Candy', 'David', 'Ellena']
print(L) # ==> ['Alice', 'Bob', 'Candy', 'David', 'Ellena']
T = tuple(L)
print(T) # ==> ('Alice', 'Bob', 'Candy', 'David', 'Ellena')
# 元组类型转换成list列表类型
T = ('Alice', 'Bob', 'Candy', 'David', 'Ellena')
print(T) # ==> ('Alice', 'Bob', 'Candy', 'David', 'Ellena')
L = list(T)
print(L) # ==> ['Alice', 'Bob', 'Candy', 'David', 'Ellena']
但是,tuple和list不一样的是,tuple是固定不变的,一旦变成tuple,tuple中的每一个元素都不可被改变,同时也不能再往tuple中添加数据,而list是可以的。元组(tuple)的这个特性是非常重要的,在运行上tuple的性能是list的数倍。
2.2 访问tuple元素的方法
count()方法用来统计tuple中某个元素出现的次数。
T = (1, 1, 2, 2, 3, 3, 1, 3, 5, 7, 9)
print(T.count(1)) # ==> 3
index()方法可以返回指定元素的下标,当一个元素多次重复出现时,则返回第一次出现的下标位置,同样的元素多次出现时返回第一次出现的位置的坐标。
T = (1, 1, 2, 2, 3, 3, 1, 3, 5, 7, 9)
T.index(5) # ==> 8
T.index(1) # ==> 0 # 多次出现,返回第一次出现的位置
2.3 创建单个元素的tuple
# 包含0个元素的 tuple
T = ()
print(T) # ==> ()
# 包含1个元素的 tuple
T = (1)
print(T) # ==> 1 # 打印结果是1
上面我们新建一个元组,打印结果却是1,为什么不是(1),是因为()
既可以表示tuple,又可以作为括号表示运算时的优先级,结果(1)
被Python解释器计算出结果 1,导致我们得到的不是tuple,而是整数 1。因此,要定义只有一个元素的tuple,需要在元素后面添加一个逗号,
而对于多个元素的tuple,则加和不加这个逗号,效果是一样的。
T = (1, )
print(T) # ==> (1, )
2.4 可变tuple
前面我们回顾了,对于tuple,它和list一个最大的不同点就是tuple是不可变的,tuple里面的元素,也是不可替换的。但是这针对的是仅包含基础数据类型(数字类型、布尔类型、字符串类型)的数据,对于组合数据类型,则不受这个约束。
T = (1, 'CH', [3, 4])
L = T[2]
print(L) # ==> [3, 4]
# 尝试替换L中的元素
L[1] = 40
print(L) # ==> [3, 40]
print(T) # ==> (1, 'CH', [3, 40])
虽然tuple中的list元素改变了,但是tuple本身指向的list仍然是同一个list,list本身并没有改变,改变的只是list里面的一个元素,这是tuple所约束不到的范围。
这样写会报错的
T = (1, 'CH', [3, 4])
L2 = [3, 40]
# 尝试替换tuple中的list
T[2] = L2
# 报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
3.dict容器
3.1 定义dict容器
在dict中,每一项包含一个key和一个value,key和value是一一对应的。在定义里,我们使用花括号{}
表示这是一个dict,然后key和value之间使用冒号:
分割,并且每一组key:value
的最后,以逗号,
表示这一组的结束。
d = {
'Alice': 45,
'Bob': 60,
'Candy': 75,
'David': 86,
'Ellena': 49
}
也可以这样定义
d = dict()
print(d) # ==> {}
3.2 读取dict数据
dict提供通过key找到对应value的功能,通过d[key]
的形式,就可以得到对应的value。
d = {
'Alice': 45,
'Bob': 60,
'Candy': 75,
'David': 86,
'Ellena': 49,
'Gaven': 86
}
print(d['Bob']) # ==> 60
# key不存在时也会报错
print(d['Dodo'])
# 抛出异常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Dodo'
另外一种通过key也能获取数据,即使不存在不会报错会返回none
print(d.get('Alice')) # ==> 45
print(d.get('Dodo')) # ==> None
3.3 添加元素
d['Mimi'] = 72
d['Mimi'] = [72, 73] #value可以是任意类型的元素,可以是list、tuple等
d['Mimi'].append(75)
3.4 更新dict元素
- 当key不存在时,往dict中添加对应的key: value元素。
- 当key存在时,会更新dict,用新的value替换原来的value。
因此,在使用赋值语句往dict中添加元素时,为了避免不必要的覆盖问题,我们需要先判断key是否存在,然后再做更新。
d['Bob'] = 75 #75
3.5 删除dict元素
dict提供便捷的pop()
方法,允许我们快速删除元素,pop()方法需要指定需要删除的元素的key,并返回对应的value。
alice_score= d.pop('Alice')
print(alice_score) # ==> 45
# 已经删除的key 再次删除会报错的
d.pop('Alice')
# 报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Alice'
3.6 dict的特点
1.查找速度快但是占用内存大,还会浪费很多内容,list正好相反,占用内存小,但是查找速度慢。
2在Python3.5之前,dict中的元素是无序的,Python3.7后版本中,却得到了有序的结果。
3.如果将list作为dict的key会引起错误。由于dict是按 key 查找,所以在一个dict中,key不能重复。
4.遍历dict
d = {
'Alice': 45,
'Bob': 60,
'Candy': 75,
'David': 86,
'Ellena': 49
}
# 第一种
for key in d: # 遍历d的key
value = d[key]
if value > 60:
print(key, value)
# ==> Candy 75
# ==> David 86
#第二种
for key, value in d.items():
if value > 60:
print(key, value)
# ==> Candy 75
# ==> David 86
3.7 操作dict的其他方法
获取dict的所有key、获取dict所有的value、清除所有元素
d = {'Alice': [50, 61, 66], 'Bob': [80, 61, 66], 'Candy': [88, 75, 90]}
# 获取所有的keys
for key in d.keys():
print(key)
# 获取所有的values
for key in d.values():
print(key)
# ==> [50, 61, 66]
# ==> [80, 61, 66]
# ==> [88, 75, 90]
# 清除所有的元素
d.clear()
print(d) # ==> {}
4.set容器
set和list类似,拥有一系列元素,但是set和list不一样,set里面的元素是不允许重复的,而list里面可以包含相同的元素;set与list的另一个区别是,set里面的元素是没有顺序的。创建set的方式是使用set()
,并传入一个list,list的元素将会被转换成set的元素。
# set中包含 重复元素时
s = set([1, 4, 3, 2, 5, 4, 2, 3, 1])
print(s) # ==> set([1, 2, 3, 4, 5]) # 打印结果会自动去除重复元素
4.1 读取set元素
names = ['Alice', 'Bob', 'Candy', 'David', 'Ellena']
name_set = set(names)
'Alice' in name_set # ==> True #存在元素 结果是true
'Bobby' in name_set # ==>False #不存在元素 结果是false
'bob' in name_set # ==> False #区分大小写 大小写不一致结果是false
4.2 添加元素
name_set.add('Gina')
# update 批量添加元素
new_names = ['Hally', 'Isen', 'Jenny', 'Karl']
name_set = set(names)
name_set.update(new_names)
4.3 删除元素 remove()
set提供了remove()方法允许我们删除set中的元素。当数据不存在的时候删除会报错,因此,使用remove()方法,我们需要格外小心,需要提前判断要remove()的元素是否在set里面,确保存在后,再进行remove。
name_set = set(['Jenny', 'Ellena', 'Alice', 'Candy', 'David', 'Hally', 'Bob', 'Isen', 'Karl'])
name_set.remove('Jenny')
# ==> 重复remove 'Jenny'引起错误
name_set.remove('Jenny')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Jenny'
4.4 操作set的其他方法
不会报错的删除方法discard()
当元素不存在时,使用discard()并不会引发错误,所以使用discard()是更加高效的一个方法。
name_set.discard('Jenny')
清除所有元素的方法clear()
name_set.clear()
集合的子集和超集
s1 = set([1, 2, 3, 4, 5])
s2 = set([1, 2, 3, 4, 5, 6, 7, 8, 9])
# 判断s1是否为s2的子集
s1.issubset(s2) # ==> True
# 判断s2是否为s1的超集
s2.issuperset(s1) # ==> True
判断集合是否重合
有时候需要判断两个集合是否有重合的地方,如果使用传统的方法,需要使用for循环一个一个的去判断,非常麻烦,set提供isdisjoint()
方法,可以快速判断两个集合是否有重合,如果有重合,返回False,否则返回True。
s1 = set([1, 2, 3, 4, 5])
s2 = set([1, 2, 3, 4, 5, 6, 7, 8, 9])
s1.isdisjoint(s2) # ==> False,因为有重复元素1、2、3、4、5
关于python的一些数据容器的基础知识到这里我们回顾完了,有问题欢迎大家评论区交流补充,感谢。python的下载安装、变量、数据类型请参考:Python 3 入门基础知识【1】数据类型 安装下载 推荐-CSDN博客
后面内容python中函数的基础知识请参考: Python 3 入门基础知识【3】函数