博客主要用于自学记录,内容参考国科大张晋连老师的Python编程课的课件
目录
第七章 数据结构(二)
7.1 概述
在前面的章节中,学了基本数据类型,包括数值类型、字符串类型、布尔类型等,这些类型能表示一个数据,这种表示单一数据的类型称为基本数据类型。
实际在计算机中,计算机不仅能处理单个变量表示的数据,更多情况下,计算机需要对一组数据进行批量处理,这就需要能表示多个数据的组合数据类型。
组合类型的种类:
- 列表
- 元组
- 字典
- 集合
7.2 列表
列表是Python中非常重要的数据类型,通常作为函数的返回类型
列表由一组元素组成。列表可包含任何类型的值:数字、字符串甚至序列。
列表是可变的,即可以在不复制的情况下添加、删除或修改列表元素。
- 1. 列表的创建
- 格式:
- lst=[元素1,元素2,…元素n] #定义n个元素组成的列表
- lst=[] #定义空列表
- lst=[x] #定义只包含一个元素的列表
- lst=list([可迭代参数])
- 说明:列表用方括号括起,其中元素用逗号分隔。
- 格式:
- 2. 列表的使用
- 列表也是序列,其使用与字符串十分相似,同样支持正、负索引、切片等特性,但列表的元素可以修改。
- 与字符串一样,可以使用len获取列表长度,还可以使用+和*拼接列表。
- 3. 列表特有操作及常用方法
- 列表操作中的切片范围均不包括第j个元素本身
列表特有操作
描述
lst[i]=x
替换列表lst第i个元素为x
lst[i:j]=t
用列表t替换列表lst中第i到第j项元素
del lst[i:j]
删除列表lst第i到第j项元素,等价于lst[i:j]=[]
del lst[i:j:k]
删除列表lst第i到第j项以k为步长的元素
- 列表的常用方法
方法
返回值
lst.append(x)
在列表lst末尾处添加元素x
lst.clear()
删除列表lst中的所有元素
lst.copy()
返回一个新列表,复制lst中的所有元素
lst.count(x)
返回元素x在列表中出现的次数
lst.extend(t)
将列表t的所有元素都添加到列表lst末尾
lst.index(x)
返回第一个x元素的索引
lst.insert(i,x)
将元素x插入到索引i指定的元素前面,结果是lst[i]=x
lst.pop(i)
删除并返回lst中索引为i的元素,若缺省参数,
返回最后1个元素
lst.remove(x)
删除lst中的第一个x元素
lst.reverse()
反转lst中元素的排列顺序
lst.sort()
将lst的元素按升序排列
- 其中,所有适用于序列的函数均适用于列表
- 调用列表方法后会改变原列表
- 列表操作方法的语法形式是:<列表变量名>.<方法名称>(<方法参数>)
- 列表操作中的切片范围均不包括第j个元素本身
- 4. 函数作为列表的元素
- 用函数作为参数与列表一起使用非常有用,称为高阶编程
7.3 元组
元组由一组元素组成。元组可包含任何类型的数值:数字、字符串甚至序列。
元组是一种不可变序列,即创建之后不能再做任何修改。
元组通常代表一行数据,而元组中的元素代表不同的数据项。
- 1. 元组的创建
- 格式:
- tpl=(元素1,元素2,…元素n) #定义n个元素组成的元组
- tpl=() #定义空元组
- tpl=(元素1,) #定义单元素元组
- tpl=tuple([可迭代参数])
- 说明:元组用圆括号括起(也可以不加圆括号),其中元素用逗号分隔
- 格式:
- 2. 元组常用方法
方法名
返回值
tpl.count(x)
元素x在元组tpl中出现的次数
tpl.index(x)
元组tpl中第一个元素x的索引,若x未包含在元组tpl中,
将引发ValueError异常
- 说明:所有适用于序列的函数均适用于元组
- 元组没有列表所常用的append、find方法
- 元组操作方法的语法形式是<元组变量>.<方法名称>(<方法参数>)
- 3. 元组用途
- 在映射类型中当作键使用
- 函数的特殊类型参数
- 作为很多内置函数的返回值
7.4 字典
字典是Python重要的数据类型,字典是由“键-值”对组成的集合,字典中的“值”通过“键”来引用。
字典也称为关联数组、隐射或散列表。
Python字典利用了“哈希”方法,使用专门的哈希函数完成,即字典中的每个键都被转换为一个数字-哈希值。字典中值存储在一个底层列表中,并用哈希值作为索引。访问值时,将提供的键转为哈希值,再转到列表的相应位置,使用“键”来访问字典值效率极高。
字典的键必须是可哈希对象,可哈希对象是指拥有__hash__(self)内置方法的对象。列表、可变集合和字典类型的数据不是可哈希对象,所以它们不能作为字典中的键。数值、字符串、元组和不可变集合是可哈希对象,因此可以作为字典的键。
与列表相同,字典也是可以改变的,可以添加、删除或修改“键-值”对。
字典的排列顺序不确定。
- 1. 创建字典
- 格式:
- dictionary ={key1:value, key2:value2,...,keyn:valuen}}#创建n个“键—值”对组成的字典
-
dictionary=dict(参数)
-
dictionary={} #创建空字典
-
dictionary=dict() #创建空字典
-
参数说明
-
参数可以是
-
键-值对
-
一个或者多个赋值表达式
-
zip函数返回的结果
-
元组列表,每个元组包含两个元素,分别对应键和值
-
一个已有的字典
-
-
-
注意
-
对于字典的键有两个限制:
-
字典中的键必须独一无二,即在同一个字典中,任何两个键值对都不能相同。若为同一键值多次定义了不同的元素值,按照字典中此键值出现的顺序,值取最右侧的一堆“键:值”
-
键必须是不可改变的(可哈希的)。因此,字典键不能是列表、字典、可变集合
-
-
对值则没有这两个限制。
-
- 格式:
- 2. 字典的访问
- 字典的访问与元组、列表有所不同,元组和列表是通过数字索引获取对应的值,而字典是通过key值获取相应的value值
- 格式:
- value=dictionary[key]
- 说明:
- 字典的添加和修改只需执行一条赋值语句即可,例如:dictionary[x]=value
- 字典的删除随没有类似列表的remove操作,但是可以调用内置函数del()完成删除字典元素(字典带有pop和clear方法,也可以完成删除的功能)
- 3. 字典常用方法
方法名
返回的值
d.items()
返回一个由字典d的键—值对(key,value)组成的视图(view)
d.keys()
返回一个由字典d的键组成的视图
d.values()
返回一个由字典d的值组成的视图
d.get(key)
返回与key相关联的值
d.pop(key)
删除键key对应的键-值对并返回与之相关联的值
d.popitem()
删除字典d中某个键—值对并返回相应的键—值对
d.clear()
删除字典d的所有元素
d.copy()
复制字典d
d.fromkeys(s,t)
创建一个新字典,其中的键来自s,值来自t
d.setdefault(key,v)
如果键key包含在字典d中,则返回其值;
否则返回v并将(key,v)添加到字典d中
d.update(e)
将e中的键—值对添加到字典d中;e可能是字典,
也可能是键—值对序列
- 说明:
- popitem()返回并删除字典的某一个键值对,具体是哪个预先不知道,因此仅当不在乎字典元素的顺序时,此函数才适用
- items()、keys()和values()都返回一个特殊对象—视图。视图被链接到原始字典,因此若字典发生变化,视图也将相应地变化。
- 说明:
- 4. 字典的排序
- 字典的排序可以使用内置函数sorted()实现(该函数可对列表、元组、字典进行排序,都不改变原对象)
- sorted(iterable, key=None, reverse=False) --> new sorted list
- 对于字典,此处:
- iterable—字典的键-值对
- –Key—排序关键字:键或值
- –reverse—升序或降序,True为降序,False为升序,默认升序
- 字典的排序可以使用内置函数sorted()实现(该函数可对列表、元组、字典进行排序,都不改变原对象)
7.5 集合
在Python中,集合类似于字典,但只包含键,而没有相关联的值。
与字典一样,集合的元素排列顺序也是不确定的,但不允许有相同元素且元素必须是可哈希的(hashable)的对象。
Python中集合的类别:集合分两类:可变集合(set)和不可变集合(frozenset)。对于可变集合,可添加和删除元素,而不可变集合一旦创建就不能更改。
- 1. 集合的创建
- 集合中的所有元素都卸载一对大括号“{}”中,各元素之间用逗号分隔。
- 创建集合时,即可以使用{},也可使用set函数
- set函数的语法格式:set([iterable])
- 其中,oterable是一个可选参数,表示一个可迭代对象(包括:字符串、列表、元组、字典、集合)
- set函数只能有一个参数或者无参
- 注意:想要创建空集合,必须使用set()函数而不是{}.
- 2. 集合的比较
- 3. 集合的逻辑运算
- 4. 集合的方法(面向所有集合)
- 5. 集合的方法(面向可变集合)
7.6 推导式
推导式是从一个或者多个迭代器快速简介地创建数据结构的一种方法
将循环和条件判断结合,从而便面语法冗长的代码
可以用来动态的生成列表、字典和集合
- 1. 推导式的基本语法
- 列表推导式:[<表达式> for <变量> in <可迭代对象> if <逻辑条件>]
- 字典推导式:{<键值表达式>:<元素表达式> for <变量> in <可迭代对象> if <逻辑条件>}
- 集合推导式:{<元素表达式> for <变量> in <可迭代对象象> if <逻辑条件>}
- 2. 生成器推导式
- 3. 列表推导式应用实例
7.7 迭代器
- 可迭代对象(iterable)——可直接使用for循环遍历的对象统称为可迭代对象。
- 迭代器(Iterator)——指有__iter()__方法和__next()__方法的对象,可以通过next函数不断获取下一个值,并不是所有的可迭代对象都是迭代器
- 可以使用isinstance方法判断一个对象是否时可迭代对象或迭代器
- 对于可迭代对象,可以通过iter函数得到迭代器
- 对于迭代器,则可以使用next函数不断获取下一个元素,当所有元素都获取完毕后再调用next函数,就会引发StopIteration异常
7.8 可变类型和不可变类型
-
可变类型—即可以对该类型对象中保存的元素值做修改,如列表、字典、可变集合都是可变类型。
-
不可变类型—即该类型对象所保存的元素值不允许修改,只能通过给对象整体赋值来修改对象所保存的数据。但此时实际上就是创建了一个新的不可变类型的对象、而不是修改原对象的值,如数字、字符串、元组、不可变集合都是不可变类型。
-
说明:
-
可变类型的对象和不可变类型的对象的区别在于是否可修改对象中的元素值。
-
对于可变类型的对象,如果对可变类型对象中的元素做修改,则不会创建新对象;而如果直接对其赋值,则也会创建一个新的对象。
-
对于数字、字符串对象,创建一个新的等值对象,实际是引用原对象;对于列表、元组、字典、集合等对象,创建一个新的等值对象则是创建一个新对象。
-