从本篇文章开始,将介绍python提供的常用数据结构。
这些数据结构从不同的维度可以进行不同的划分。
按可变性划分:
- 可变数据结构:list,dict,set,bytearray
- 不可变数据结构:tuple,string,bytes
按是否可以存储不同类型的元素划分:
- 扁平数据结构:string,bytes,bytearray
- 容器数据结构:list,dict,set,tuple
后面将会陆续从序列,集合,映射,可调用对象这4类来逐一介绍。
介绍list之前,我们有必要了解一下什么是序列.
之所以称为序列,是因为它们都有以下特性.
- 能够通过索引来进行顺序访问
- 内置的函数len()可以返回序列的长度。如果序列的长度为n,则可以通过0….n-1来访问每个元素
- 支持切片操作a[i:j]
- 序列类型有string,tuple,bytes,list,bytearray几种
好了,地基打好了,我们开始学习序列中的首个类型:list.
list是python中最常用的数据结构之一.基本上可以将其看作是一个可以动态增长且使用方便的数组.
list是一种容器,可以容纳任意的python对象.
要使用list,首先我们需要创建list.
构造list
- 空list:[]
- 直接构造list:[1,2,3]
- 使用列表生成式:[ x for x in iterable]
- 使用构造函数:list()或list(iterable)
关于4有几点说明:由iterable构造的list的元素顺序保持不变;可以使用任何可迭代对象来构造list,如list(‘abc’)返回[‘a’, ‘b’, ‘c’],list((1,2,3))返回[1,2,3].如果不指定任何参数,则返回一个空list.
使用list
list实现了序列具有的一些通用方法:
操作
结果
x in s
判断x是否在s中
x not in s
判断x是否不在s中
s + t
连接s,t
s * n
or n * s
将s重复n次
s[i]
s中第i个元素,从0开始
s[i:j]
从i到j的切片
s[i:j:k]
以k为步长,从i到j的切片
len(s)
s的长度
min(s)
s中的最小元素
max(s)
s中的最大元素
s.index(x[, i[, j]])
x在s中的第一个位置,可以指定特定的区间[i,j]
s.count(x)
s中x出现的次数
另外,作为可变序列类型,list还具有可变序列的一些通用方法
Operation
Result
s[i] = x
设置第i个元素为x
s[i:j] = t
将i-j设置为可迭代的t
del s[i:j]
删除i到j,等价于 s[i:j] = []
s[i:j:k] = t
用可迭代的t替换i-j,步长为k
del s[i:j:k]
以k为步长删除i-j
s.append(x)
将x添加到s末尾,等价于 s[len(s):len(s)] = [x]
s.clear()
删除s中所有元素,等价于del s[:]
s.copy()
创建s的一个拷贝,等价于s[:]
s.extend(t)
or s += t
用t扩充s,等价于s[len(s):len(s)] = t
s *= n
n个s
s.insert(i, x)
在位置i插入x.等价于s[i:i] = [x]
s.pop([i])
获取第i个元素并从s中m删除,不指定i则获取最后一个元素
s.remove(x)
从s中删除第一个等于x的元素
s.reverse()
就地翻转s
最后,list还支持以下方法:
-
sort
(*, key=None, reverse=None)
就地排序list,默认使用’<’比较每个元素的大小。
- key:我们可以通过关键字参数key来指定排序函数,这个排序函数接受一个元素,根据其返回值决定元素的大小。如果中途发生错误,sort不会抛出异常,list可能处于一个中间状态.python2中有许多比较函数使用2个参数,如locale.strcoll.为了方便地将2.x中的这些函数转换为key可以使用的函数,我们可以使用functools.cmp_to_key来将2.x中的函数进行包装.
- reverse:是为逆序.
值得注意的是sort排序是稳定的,意味着会保持2个相同元素的相对位置.
其它
- 关于列表表达式:列表表达式可以使代码更具表达力如得到每个字符的ascii值: [ord(x) for x in ‘abc’]
- 将list当作栈LIFO来使用十分高效,通过append方法向list末尾添加元素,通过无参数的pop方法将最后一个元素弹出
- list不适合作为队列FIFO来使用,因为从头来添加和删除元素需要对剩余元素进行移动。此时应该使用适合在两头进行添加删除的collections.deque.
关于list,掌握这些已经相当够用了。