-
基本顺序存储结构——列表与元组
Python中的基本顺序存储结构是列表与元组,在操作的复杂度上和数组完全相同,其中列表是可变数据类型,元组是不可变数据类型。这里先介绍一下两种数据结构共有的方法:
x in s | 返回布尔值,x在s中 |
x not in s | 返回布尔值,x不在s中为True |
s + t | s和t的拼接,可以+= |
s * n or n * s | n为int类型,返回s重复n次的结果。可以*=,同上 |
s[i] | 返回索引为i的元素 |
s[i:j(:k)] | 切片,返回子数组,从s[i]~s[i-1],k为步长,默认为1. |
len(s) | 现有元素个数 |
min(s) | 最小元素 |
max(s) | 最大元素 |
s.index(x[,i[,j]]) | 在s[i] ~ s[j-1]中,第一个大小为x的元素的索引,i,j默认0,-1 |
s.count(x) | 统计x的数目 |
这些都不涉及对数组内元素的更改,因此是列表和元组都可以使用的。注意元组只能使用以上的方法。
接下来介绍可变有序容器的方法,注意各种方法都有利用切片赋值的实现!
s[i] = x | 赋值操作 |
s[i:j(:k)] = t | 按照切片规则选择元素进行赋值,注意如果t为[]可以用作删除,如果i==j可以用作插入 |
del s[i:j(:k)] | 按照切片规则进行删除 |
s.append(x) | 在尾部插入,等价于s.insert(I,len(s)),复杂度O(1). |
s.clear() | 清空所有元素 (等价于del s[:]) |
s.copy() | 创建一份s的浅拷贝 (等价于 s[:]) |
s.extend(t) or s += t | 在后面插入一组,相当于+=; |
s.insert(i, x) | 在i处插入x (等价于s[i:i] = [x]) |
s.pop([i]) | 默认删除尾部元素,否则删除i处的元素 |
s.remove(x) | 删除第一个等于x的元素 |
s.reverse() | 列表反向 |
此外,列表还独有s.sort(key=None, reverse=None),其中key是一个函数名,也就是比较函数,reverse为布尔值,True的话则会列表反向。
Sort单独列出来是因为如果自己从可变有序容器里面派生的话并没有这个方法。
在机器学习实战一书中,一般用列表来处理读取存储在文本中的数据,在进行矩阵运算等数据运算的情况下,用numpy下的array,以此避免造成混乱。
2.基本哈希存储结构——字典
字典是基于哈希表的一种映射结构,注意本文中介绍的Python的数据结构并没有任何一种使用了红黑树的搜索结构。
len(d) | 返回字典元素个数 |
d[key] | 返回key对应的value |
d[key] = value | 为字典元素赋值,如果没有则增加元素 |
del d[key] | 删除字典元素 |
key in d/ key not in d | 查看key是否在d中 |
iter(d) | 返回一个迭代器,具有__next__()方法 |
clear() | 清空 |
copy() | 浅复制 |
fromkeys(seq[, value]) | 以seq作为键,value作为值建立字典,默认value为None |
get(key[, default]) | 安全的get方法,如果不存在返回default,如果不指定default则报错 |
items() | 列出一个键值对的view |
keys() | 列出key的view,通常用于遍历 |
values() | Return a new view of the dictionary's values. |
pop(key[, default]) | Key在d中则删除,和del[key]一样,default如果被指定,那么当不存在key的时候会返回default而不会报错 |
popitem() | 弹出一个键值对,为key的哈希序列中的第一个 |
setdefault(key[, default]) | 安全的添加操作,如果存在就返回value不更改值,如果不存在添加一个key:default的表项,default默认为0 |
update([other]) | 更改操作,other可以是键值对的列表或元组(二级的),也可以是字典,用other中的键值对添加到或替换原有键值对 |
Python中由set和frozenset两种集合结构。由于set中的元素既是键又是值,所以他的内容必须是不可修改的,frozenset就是被声明为常量的set,,用于建立集合的集合
首先介绍两种集合共有的方法:
注意用的都是逻辑运算符进行衍生而不是+
len(s) | 集合元素个数 |
x in/not in s | 是否在集合中 |
isdisjoint(other) | 和other的交集为空 |
set <= other | 包含于 |
set < other | 真包含于 |
set >= other | 包含 |
set > other | 真包含 |
set | other | ... | 并 |
set & other & ... | 交 |
set - other - ... | 差 |
set ^ other | 对称差(并-交) |
copy() | 浅拷贝 |
而set独有的方法是,一个是诸如&=之类的运算符,还有:
add(elem) | 增加元素 |
remove(elem) | 删除元素,不存在则报错 |
discard(elem) | 删除元素,不存在不报错 |
pop() | 删除哈希表第一个元素,空集报错 |
clear() | 清空 |
上述都是最基本的数据类型,还有一些拓展类,用到再做总结。