第五章:Python组合数据类型
总览
6.1 组合数据类型的基本概念
计算机通常需要对一组数据进行处理,这种能够表达多个数据的类型称为组合数据类型。
Python语言中最常用的有三大类:集合类型、序列类型和映射关系。
- 集合类型是一个元素的集合,元素之间无序,相同元素在集合中唯一存在。
- 序列类型是一个元素向量,元素之间存在顺序,通过序号访问,元素之间不排他。(字符串和列表)
- 映射类型是“键-值”数据项的组合,每一个元素都是一个键值对,表示为(key,value)。典型代表就是字典。
- 集合类型是一个具体的数据类型的名称,而序列类型和映射类型则是一类数据类型的总称。
6.1.1 集合类型概述
1.集合是无序组合,用{}表示,没有索引和位置概念,因此集合中的元素不能比较,不能排序。
2.集合中的元素可以动态增删。
3.集合中的元素不可重复,元素类型只能是不可变类型。但是注意,在输入的时候元素时可以重复的并不受限制,元素输入后,集合会自动去重。由于其这一特性,集合一般用来过滤重复元素。
用S和T分别表示两个集合类型的数据,演示其操作符运算如下
操作符 | 描述 |
---|---|
S-T | 返回一个集合,包含在S但不在T中的元素 |
S&T | 返回一个集合,包含同时在S和T中的元素 |
S^T | 返回一个集合,包含S和T的非共同元素 |
S|T | 返回一个集合,包含S和T中的全部元素 |
代码演示如下:
>>> S = {1010,"1010",78.9}
>>> T = {1010,"1010",12.3,1010,1010}
>>> print(S)
{78.9, 1010, '1010'}
>>> print(T)
{1010, 12.3, '1010'}
>>> S-T
{78.9}
>>> T-S
{12.3}
>>> S&T
{1010, '1010'}
>>> T & S
{1010, '1010'}
>>> S ^ T
{78.9, 12.3}
>>> T ^ S
{78.9, 12.3}
>>> S | T
{1010, '1010', 12.3, 78.9}
>>> T | S
{1010, 78.9, 12.3, '1010'}
>>>
函数或方法 | 描述 |
---|---|
S.add(x) | 如果x不在集合S中,则添加x至S中 |
S.remove(x) | 若x在S中,则移除该元素;不在则产生KeyError异常 |
S.clear() | 移除S中的全部数据项 |
len(S) | 返回S的元素个数 |
x in S | 如果x是S的元素,返回True,否则返回False |
x not in S | 如果x不是S的元素,返回True,否则返回False |
set(x)函数可以将其他组合数据类型变成集合类型,结果是返回一个无重复且任意排列的集合。set()也可以生成空集合变量。
>>> S = set()
>>> S
set()
这里输出的的set()表示空集合
集合类型主要用来元素去重,适合任何组合变量类型
>>> S = set('知之为知之不知为不知')
>>> print(S)
{'知', '为', '之', '不'}
>>> for i in S:
print(i,end='')
知为之不
>>>
6.1.2 序列类型概述
- 序列类型是一维元素向量,元素之间存在先后关系,通过序号访问。
- 当需要访问序列中某个特定值时,只需要通过下标即可。
- 由于序列中存在顺序关系,因此可以存在数值相同位置不同的值。
- 需要注意序列类型的下标序号是从0开始,通常指第一个元素指的是序号为0的元素,习惯上叫第0元素
操作符 | 描述 |
---|---|
x in s | 如果x是s的元素,则返回True;否则返回False |
x not in s | 如果x不是s的元素,则返回True;否则返回False |
s+t | 连接s和t |
s*n或n*s | 将s复制n次 |
s[i] | 索引,返回s中的第i元素 |
s[i:j] | 切片,返回包含s第i到第j元素的子序列(不包含第j元素) |
s[i:j:k] | 步骤切片,返回返回包含s第i到第j元素以k为步长的子序列 |
len(s) | 序列s的元素个数(长度) |
min(s) | 序列s中最小的元素 |
max(s) | 序列s中最大的元素 |
s.index(x) | 序列中第一次出现x的位置 |
s.count(x) | 序列中x出现的次数 |
序列类型中除了字符串类型外,以元组类型为代表。元组类型在Python中表示为tuple,一般用小括号和逗号进行组织。
以元组类型演示序列类型的操作符和函数如下:
>>> t = (0,1,2,3,4,5,6,7,8,9)
>>> type(t)
<class 'tuple'>
>>> 1 in t
True
>>> 1 not in t
False
>>> s = ('a','b','c','d','e','f','g')
>>> t + s
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f', 'g')
>>> t * 2
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
>>> 2 * t
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
>>> t[2]
2
>>> t[3:8]
(3, 4, 5, 6, 7)
>>> t[2:7:2]
(2, 4, 6)
>>> len(t)
10
>>> min(t)
0
>>> max(t)
9
>>> t.index(3)
3
>>> t.count(9)
1
>>>
元组类型一旦定义就不能更改,在编程中不够灵活,如果确认编程中不需要更改,则可以使用元组类型。
元组主要在Python语法相关中使用,例如函数返回多个返回值时,这多个返回值其实是以元组形式返回。实际上返回一个数据类型。
6.1.3
映射类型是“键-值”数据项的组合,每个元素都是一个键值对,元素之间是无序的。
键值对是一种二元关系,源于属性和值的映射关系。
映射类型是序列类型的一种扩展。在序列类型中,采用从0开始的正向递增序号进行具体的元素值的索引。而映射类型则是由用户自行定义序号,即键,用键去索引具体的值。
6.2 列表类型
6.2.1 列表的定义
- 列表是包含0个或多个元组的有序数列,属于序列类型。
- 列表可以进行增删改查等操作
- 列表没有长度限制,元素类型也可以不同,不需要预定长度。
- 列表使用中括号[]表示,也表示通过list(x)函数将集合或字符串转换成的列表类型。list()函数可以生成空列表
- 由于列表属于序列类型,所以可以使用6.1.2中序列类型的相关操作。
>>> ls = [1010,'1010',[1010,'1010'],1020]
>>> ls
[1010, '1010', [1010, '1010'], 1020]
>>> list('列表可以使用集合或字符串生成')
['列', '表', '可', '以', '使', '用', '集', '合', '或', '字', '符', '串', '生', '成']
>>> list()
[]
>>>
6.2.2 列表的索引
索引是列表的基本操作,用于获取列表中的某一个元素。该操作沿用了序列类型的索引方式。
>>> ls = [1010,'1010',[1010,'1010'],1020]
>>> ls[3]
1020
>>> ls[-2]
[1010, '1010']
>>> ls[5]
Traceback (most recent call last):
File "<pyshell#43>", line 1, in <module>
ls[5]
IndexError: list index out of range
>>>
列表元素可以使用遍历循环进行遍历,基本使用如下:
>>> ls = [1010,'1010',[1010,'1010'],1020]
>>> for i in ls:
print(i)
1010
1010
[1010, '1010']
1020
>>>
6.2.3 列表的切片
切片同样是列表的基本操作,用于获得列表的一个片段,即获得零个或多个元素。
>>> ls = [1010,'1010',[1010,'1010'],1020]
>>> ls[1:4]
['1010', [1010, '1010'], 1020]
>>> ls[-1:-3]
[]
>>> ls[-3:-1]
['1010', [1010, '1010']]
>>> ls[1:-1]
['1010', [1010, '1010']]
>>> ls[0:4:2]
[1010, [1010, '1010']]
>>>
6.3 列表类型的操作
6.3.1 列表的操作函数
列表继承了序列类型的一些特点,所以有一些通用的操作函数。
但是要注意:列表中的元素可能存在不可比较的情况,所以min()和max()两个比较操作的函数时,请小心使用。若列表间元素不可比较,则会报错。
6.3.2 列表的操作方法
列表除了有继承自序列类型的操作方法外,也有自己的一些方法。
- ls.append(s) 在列表ls的最后加上一个元素x
>>> ls = ['1010','10.10','python']
>>> ls.append(1010)
>>> print(ls)
['1010', '10.10', 'python', 1010]
>>> ls.append([1010,0x1010])
>>> print(ls)
['1010', '10.10', 'python', 1010, [1010, 4112]]
>>>
ls.append(x)仅仅是在列表中加一个元素,如果想要添加多个元素,请使用+将两个列表合并
>>> ls = ['1010','10.10','python']
>>> lt = [1010,[1010,0x1010]]
>>> ls += lt
>>> print(ls)
['1010', '10.10', 'python', 1010, [1010, 4112]]
>>>
- ls.insert(i,x)在列表ls中序号为i的位置上添加元素x,序号i之后的元素全体后移
>>> ls = ['1010','10.10','python']
>>> ls.insert(1,'py')
>>> print(ls)
['1010', 'py', '10.10', 'python']
- ls.clear()将列表中的全部元素删除,清空列表。
>>> ls = ['1010','10.10','python']
>>> ls.clear()
>>> print(ls)
[]
- ls.pop(i)将第i元素从列表中返回,然后将其从列表中删除。
>>> ls = ['1010','10.10','python']
>>> print(ls.pop(1))
10.10
>>> print(ls)
['1010', 'python']
- ls.remove(x)将出现的第一个x元素删除,若不存在x则报ValueError
>>> ls = ['1010','10.10','python']
>>> ls.remove('10.10')
>>> print(ls)
['1010', 'python']
>>> ls.remove('10.10')
Traceback (most recent call last):
File "<pyshell#79>", line 1, in <module>
ls.remove('10.10')
ValueError: list.remove(x): x not in list
>>>
除了上述方法,还可以使用Python保留关键字del对列表元素或者片段进行删除。
>>> ls = ['1010','10.10','python']
>>> del ls[1]
>>> print(ls)
['1010', 'python']
>>> ls += ls
>>> del ls[2:]
>>> print(ls)
['1010', 'python']
>>> ls = ['1010','10.10','python','4112',1010,1111]
>>> del ls[1:5:2]
>>> print(ls)
['1010', 'python', 1010, 1111]
>>>
- ls.reverse()将列表中ls中的元素逆序反转
>>> ls = [1,2,3,4,5]
>>> print(ls.reverse())
None
>>> print(ls)
[5, 4, 3, 2, 1]
>>>
- ls.copy()复制ls中所有元素生成一个新列表
>>> ls = [1,2,3,4,5]
>>> lt = ls.copy()
>>> print(ls)
[1, 2, 3, 4, 5]
>>> print(lt)
[1, 2, 3, 4, 5]
>>> ls.clear()
>>> print(ls)
[]
>>> print(lt)
[1, 2, 3, 4, 5]
>>>
通过上述例子可以看出,ls使用copy()方法复制后复制给lt,将ls中的元素清空对于lt无任何影响,说明ls和lt只是元素值相同的两个相互独立列表。而如果不使用copy()方法,通过直接赋值的方法不能产生新列表,仅仅是给原有列表起了一个别名,示例如下:
>>> ls = [1,2,3,4,5]
>>> lt = ls
>>> print(ls)
[1, 2, 3, 4, 5]
>>> print(lt)
[1, 2, 3, 4, 5]
>>> ls.clear()
>>> print(ls)
[]
>>> print(lt)
[]
>>>
需要注意:对于基本数据类型,例如整数和字符串,可以通过等号实现元素赋值。但是对于列表类型,使用等号无法实现真正的赋值。其中ls = lt语句并不是拷贝lt中元素给变量ls,而是关联了一个引用,即ls和lt指向的是同一套数据。
6.4 字典类型
6.4.1 字典的定义
键值对 是组织数据的一种重要方式广泛应用于当代大型信息系统中。
Python语言中的字典使用大括号{}建立,每个元素都是一个键值对。
【提示】字典和集合形式上都使用大括号表示,但如果直接饮用大括号,则生成的是字典类型而不是集合类型。
6.4.2 字典的索引
索引是按照一定顺序检索内容的体系。列表类型采用元素顺序作为索引。而字典中的元素则是以 键值对的键作为索引。
6.5字典类型的操作
6.5.1通用操作函数
len(d)给出字典d的元素个数,也称为长度。
min(d)和max(d)分别返回字典d中的最小索引值和最大索引值,前提是d中的索引值可比较。
dict()函数用于生成空字典,作用和{}相同。
>>> d = {'201801':'小明','201802':'小红','201803':'小白'}
>>> len(d)
3
>>> min(d)
'201801'
>>> max(d)
'201803'
>>> d = dict()
>>> print(d)
{}
>>>
6.5.2字典操作方法
d.keys()返回字典中的所有键信息,返回结果是Python的一种内部数据类型dict_keys,专用于表示字典的键。如果希望更好的使用返回结果,可以转换为列表类型。
>>> d = {'201801':'小明','201802':'小红','201803':'小白'}
>>> d.keys()
dict_keys(['201801', '201802', '201803'])
>>> type(d.keys())
<class 'dict_keys'>
>>> list(d.keys())
['201801', '201802', '201803']
>>>
d.values()返回字典中的所有值信息,返回结果是Python的一种内部数据类型dict_values,专用于表示字典的值。如果希望更好的使用返回结果,可以转换为列表类型。
>>> d.values()
dict_values(['小明', '小红', '小白'])
>>> type(d.values())
<class 'dict_values'>
>>> list(d.values())
['小明', '小红', '小白']
>>>
d.items()返回字典中的所有键值对信息,返回结果是Python的一种内部数据类型dict_items,专用于表示字典的键值对。如果希望更好的使用返回结果,可以转换为列表类型。
>>> d.items()
dict_items([('201801', '小明'), ('201802', '小红'), ('201803', '小白')])
>>> type(d.items())
<class 'dict_items'>
>>> list(d.items())
[('201801', '小明'), ('201802', '小红'), ('201803', '小白')]
d.get(key,default)根据键信息查找并返回值信息,如果key存在则返回相应值,不存在则返回默认值。第二元素default可以省略,省略则默认为空
>>> d.get('201802')
'小红'
>>> d.get('201809')
>>> d.get('201809','不存在')
'不存在'
d.pop(key,default)根据键信息查找并返回值信息,如果key存在则返回相应值,不存在则返回默认值。第二元素default可以省略,省略则默认为空。不同于d.get()的地方在于,d.pop()取出相关值后会在列表中将取出的键值对删除。另外要注意的是,若不指定第二元素default,在3.6以后的版本会报错。
>>> d.pop('201802')
'小红'
>>> d.pop('201802')
Traceback (most recent call last):
File "<pyshell#196>", line 1, in <module>
d.pop('201802')
KeyError: '201802'
>>> d.pop('201802','不存在')
'不存在'
>>>
d.popitem()随机从字典中取出一个键值对,以元组(key,value)形式返回。取出后从字典中删除这个键值对。
>>> d = {'201801':'小明','201802':'小红','201803':'小白'}
>>> print(d.popitem())
('201803', '小白')
>>> d
{'201801': '小明', '201802': '小红'}
>>>
d.clear()清除字典中的全部键值对。
另外,字典类型也和其他组合数据类型一样可以使用遍历循环对元素进行遍历。
例行公事
再次悄咪咪的佛系推一下自己的交流群。欢迎各位大佬莅临本群指导菜鸟,也欢迎各个菜鸟一起菜鸟互啄。