0. 组合数据类型的基本概念
定义: 能够表示多个数据的类型称为组合数据类型。
组合数据类型分类: 集合类型;序列类型;映射类型。
集合类型: 是一个元素集合,元素之间无序,相同元素在集合中唯一存在。
序列类型: 是一个元素向量,元素之间存在先后关系,通过序号访问,元素之间不排他,可重复。序列类型的典型代表是字符串类型和列表类型。
映射类型是:“键-值”数据项的组合,每个元素是一个键值对,表示为(key, value)。映射类型的典型代表是字典类型。
0.1 集合类型操作函数或方法
函数或方法 | 描述 |
---|---|
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 |
0.2 序列类型的操作符和函数
操作符 | 描述 |
---|---|
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] | 索引,返回序列的第i个元素 |
s[i: j] | 切片,返回包含序列s第i到j个元素的子序列(不包含第j个元素) |
s[i: j: k] | 步骤切片,返回包含序列s第i到j个元素以j为步数的子序列 |
len(s) | 序列s的元素个数(长度) |
min(s) | 序列s中的最小元素 |
max(s) | 序列s中的最大元素 |
s.index(x) | 序列s中第一次出现元素x的位置 |
s.count(x) | 序列s中出现x的总次数 |
1 集合
1.1 定义
Python语言中的集合类型与数学中的集合概念一致,即包含0个或多个数据项的无序组合。集合是无序组合,用大括号"{}
"表示,它没有索引和位置的概念,集合中元素可以动态增加或删除。
集合(set)是可变,无序,不重复的元素的集合
1.2 集合的操作
- 集合初始化定义:
s1 = set()
s2 = {
1,2,3}
s5 = set(range(5))
- 集合类型有一些常用的操作函数或方法
函数或方法 | 描述 |
---|---|
S.add(x) | 如果数据项x不在集合S中,将x增加到s |
S.remove(x)★ | 如果x在集合S中,移除该元素;不存在则KeyError异常 |
S.discard(x)★ | 存在x则移除,不存在则不报错,不改变原来的集合 |
S.clear() | 移除S中所有数据项 |
len(S) | 返回集合S元素个数 |
x in S | 如果x是S的元素,返回True,否则返回False |
x not in S | 如果x不是S的元素,返回True,否则返回False |
set.pop() | 任意移除一个元素,并返回移除的元素. |
- 集合的操作符
集合类型有4个操作符,交集(&).并集(|).差集(-).补集(^),操作逻辑与数学定义相同。
操作符的运算 | 描述 |
---|---|
S – T | 返回一个新集合,包括在集合S中但不在集合T中的元素 |
S & T | 返回一个新集合,包括同时在集合S和T中的元素 |
S ^ T | 返回一个新集合,包括集合S和T中非共同元素 |
S | T | 返回一个新集合,包括集合S和T中所有元素 |
1.3 集合成员运算符比较
线性结构的查询时间复杂度是O(n),即随着数据规模的增大而增大耗时.
set,dict 等结构,内部使用hash 值作为key,时间复杂度可以做到O(1),查询时间与数据规模无关.
示例:
n1 = 100
n2=1000000
l1= list(range(n1))
l2=list(range(n2))
s1= set(range(n1))
s2=set(range(n2))
%timeit (-1 in l1)
>>>2.02 µs ± 53.9 ns
%timeit (-1 in l2)
>>>19.9 ms ± 293 µs
%timeit (-1 in s1)
>>>106 ns ± 2.06 ns
%timeit (-1 in s2)
>>>97.8 ns ± 0.964 ns
由上可以看出,判断某个数是否在所列数据结构中,用集合检索的速度远远快于列表.其时间复杂度为O(1).
这里主要运用到了hash
.第一步就是对元素进行hash,如果存在则hash值不变,如果不存在则可以进行hash,因此查找是否存在只需要操作一次便可完成,所以其速度非常快,故可以应用于元素的检索中.
以下都是不可变类型,是可哈希类型,hashable
int,float,complex #数值型
True,False #布尔型
string,bytes #字符串
tuple
None
2. 列表类型
2.1 列表定义
列表是包含0个或多个元组组成的有序序列,属于序列类型。列表可以进行元素增加,删除,替换,查找等操作。列表没有长度限制,元素类型可以不同,不需要预定义长度。
列表类型用中括号"[]
"表示,也可以通过list(x)
函数将集合或字符串类型转换成列表类型。
2.1.1列表的操作函数
操作函数 | 描述 |
---|---|
len(ls) | 列表ls的元素个数(长度) |
min(ls) | 列表ls中的最小元素 |
max(ls) | 列表ls中的最大元素 |
list(x) | 将x转变成列表类型 |
2.1.2 列表操作方法
方法 | 描述 |
---|---|
ls.append(x) | 在列表ls最后增加一个元素x O(1) |
ls.insert(i, x) | 在列表ls第i位置增加元素x |
ls.clear() | 删除ls中所有元素 |
ls.pop(i) | 将列表ls中第i项元素取出并删除该元素O(n) |
ls.remove(x) | 将列表中出现的第一个元素x删除O(n) |
ls.reverse()★ | 列表ls中元素反转 |
ls.copy() | 生成一个新列表,复制ls中所有元素 |
ls.extend() | 在原列表尾部连续追加多个元素 |
ls.index() | 返回s中第一次出现元素x的位置O(1) |
ls.sort() | 对列表元素进行排序 当reverse =True 时反转降序 |
ls1 +ls2 | 生成一个新的列表,两个列表尾部相加(但重新分配内存,空间复杂度高) |
-
01特例ls.copy
list1 = [1,[1,2,3],4] list2 = list1.copy() list[1][1] =5 lsit1 = list2 ?
答案是相等。
列表拷贝为浅拷贝,只拷贝了地址,故后期修改地址内的数据被复制列表也会作相应的修改。
若想完整拷贝需要倒入库进行深拷贝:
import copy :
list1 = list0.copy.deepcopy()
这个进行的拷贝就会完整复制所有数据。
同样:
list2 = [1,2,3]
list3 = list2 *3
这种也是浅拷贝,修改一个数据,后面的数据同样更改。慎用!!!!
- 02特例ls.sort()
ls1=[1,2,4,5,"3"]
ls1.sort()#会报错,但是使用
ls1.sort(key=int) #可以将列表的类型改为相同格式,使排序成立。
>>>ls1=[1,2,"3",4,5]#不修改列表中原格式
3.元组
3.1 定义:
元组(tuple)是关系数据库中的基本概念,关系是一张表,表中的每行(即数据库中的每条记录)就是一个元组,每列就是一个属性。
元组类型一旦定义就不能修改,在