list

从本篇文章开始,将介绍python提供的常用数据结构。

这些数据结构从不同的维度可以进行不同的划分。

按可变性划分:

  1. 可变数据结构:list,dict,set,bytearray
  2. 不可变数据结构:tuple,string,bytes

按是否可以存储不同类型的元素划分:

  1. 扁平数据结构:string,bytes,bytearray
  2. 容器数据结构: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

  1. 空list:[]
  2. 直接构造list:[1,2,3]
  3. 使用列表生成式:[ x for x in iterable]
  4. 使用构造函数: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还具有可变序列的一些通用方法

OperationResult
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 *= nn个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=Nonereverse=None)

就地排序list,默认使用'<‘比较每个元素的大小。

  1. key:我们可以通过关键字参数key来指定排序函数,这个排序函数接受一个元素,根据其返回值决定元素的大小。如果中途发生错误,sort不会抛出异常,list可能处于一个中间状态.python2中有许多比较函数使用2个参数,如locale.strcoll.为了方便地将2.x中的这些函数转换为key可以使用的函数,我们可以使用functools.cmp_to_key来将2.x中的函数进行包装.
  2. reverse:是为逆序.

值得注意的是sort排序是稳定的,意味着会保持2个相同元素的相对位置.

其它

  1. 关于列表表达式:列表表达式可以使代码更具表达力如得到每个字符的ascii值: [ord(x) for x in ‘abc’]
  2. 将list当作栈LIFO来使用十分高效,通过append方法向list末尾添加元素,通过无参数的pop方法将最后一个元素弹出
  3. list不适合作为队列FIFO来使用,因为从头来添加和删除元素需要对剩余元素进行移动。此时应该使用适合在两头进行添加删除的collections.deque.

关于list,掌握这些已经相当够用了。

43.6K

发表评论

电子邮件地址不会被公开。