序列类型有三种:list, tuple, range
x in s | 如果s中某项等于x则结果为True,否则为False |
x not in s | 如果s中的某项等于x则结果为False,否则为True |
s + t | s与t相拼接 |
s*n 或 n*s | 相当于s与自身进行n次拼接 |
s[i] | s的第i项,起始为0 |
s[i:j] | s从i到j的切片 |
s[i:j:k] | 从i 到 j步长为k的切片 |
len(s) | s的长度 |
min(s) | s的最小项 |
max(s) | s的最大项 |
s.index(x[, i[, j]]) | x在s中首次出现的索引号(索引号在i或其后且在j之前) |
s.count(x) | x在s中出现的总次数 |
相同序列类型也可以做比较操作,特别地,tuple 和 list的比较是通过比较对应元素的字典顺序。这意味着想要比较结果相等,则每个元素比较结果都必须相等,并且两个序列长度必须相同。
说明:
1、虽然in和not in操作在通常情况下仅被用于简单的成员检测,某些专门化序列(如,str, bytes和bytearray)也使用它他进行子序列检测。
2、小于0的值会被当作0来处理(生成一个与s同类型的空序列)。请注意序列s中的项并不会被拷贝,它们会被多次引用。
具体的原因在于[[]]是一个包含了一个空列表的单元素列表,所以[[]]*3结果中的三个元素都是对这一个空列表的引用。修改lists中的任何一个元素实际上都是对这个空列表的修改。您可以用以下方式创建以不同列表为元素的列表:
3、如果i或j为负值,则索引顺序相对于序列s的末尾,索引号会被替换为len(s)+i或len(s)+j。但要注意 -0 仍然为0。
4、s从i到j的切片被定义为所有满足 i <= k < j 的索引号k项组成的序列。如果i或j大于len(s),则使用len(s)。如果i 被省略或为None,则使用0。 如果j被省略或为None,则使用len(s)。如果i大于等于j,则切片为空。
5、s从i到j步长为k的切片被定义为所有满足0 <= n (j-1)/k的索引号 x = i + n*k的项组成的序列,换句话说,索引号为i, i+k, i+2*k, i+3*k,以此类推,当达到j时停止(但一定不包括j)。当k为正值时,i和j 会被减至不大于len(s)。当k为负值时,i和j 会被减至不大于len(s)-1。如果i或j被省略或为None,它们会成为“终止”值(是哪一端的终止值则取决于k的符号)。注意,k不可为0,如果k为None,则当1处理。
6、拼接不可变序列总是会生成新的对象,这意味着通过重复拼接来构建序列的运行时开销将会基于序列总长度的乘方,想要获得线性的运行时开销,必须改用下列替代方案之一:
- 如果拼接str对象,你可以构建一个列表并在最后使用str.join()或是写入一个io.StringIO实例并在结束时获取它的值。
- 如果拼接bytes对象,你可以类似地使用bytes.join()或io.BytesIO,或者你也可以使用bytearray对象进行原地拼接,bytearray对象是可变的,并且具有高效的分配机制。
- 如果拼接tuple对象,请改为扩展list。
- 对于其他类型,请查看相应的文档。
7、某些序列类型(例如range)仅支持遵循特定模式的项序列,因此并不支持序列拼接或重复。
8、当x在s中找不到时,index会引发ValueError。不是所有实现都支持传入额外参数i和j。 这两个参数允许高效地搜索序列的子序列。传入这两个额外的参数大致相当于使用s[i:j].index(x),但是不会复制任何数据,并且返回的索引是相对于序列的开头而非切片的开头。
不可变序列类型
不可变序列类型普遍实现而可变序列类型未实现的唯一操作就是对hash()内置函数的支持。这种支持允许不可变类型,例如tuple实例被用作dict键,以及存储在set和frozenset实例中,尝试对包含有不可哈希值的不可变序进行哈希运算将会导致TypeError。
可变序列类型
运算 | 结果 |
s[i] = x | 将s的第i项替换为x |
s[i:j] = t | 将s从i到j的切片替换为可迭代对象t的内容 |
del s[i:j] | 等同于s[i:j] = [] |
s[i:j:k] = t | 将s[i:j:k]的元素替换为t的元素 |
del s[i:j:k] | 从列表中移除s[i:j:k]的元素 |
s.append(x) | 将x 添加到序列的末尾(等同于s[len(s):len(s)] = [x]) |
s.clear() | 从s中移除所有项(等同于del s[:]) |
s.copy() | 创建s的浅拷贝,(等同于s[:]) |
s.extend(t)或 s+=t | 用t的内容扩展s(基本上等同于s[len(s):len(s)] = t) |
s *= n | 使用s内容重复n次来对其进行更新 |
s.insert(i,x) | 在由i给出的索引位置将x插入s(等同于s[i:i]=[x]) |
s.pop([i]) | 提取在i位置上的项,并将其从s中移除 |
s.remove(x) | 删除s中第一个s[i]等于x的项目 |
s.reverse() | 就地将列表中的元素逆序 |
说明:
- t 必须与它所替换的切片具有相同的长度
- 可选参数i默认为-1,因此在默认情况下会移除并返回最后一项。
- 当在s中找不到x时,remove操作会引发ValueError
- 当反转大尺寸序列时reverse()方法会原地修改该序列以保证空间经济性。为提醒 用户此操作是通过间接影响进行的,它并不会返回反转后的序列。
- 包括clear()和copy()是为了与不支持切片操作的可变容器(例如dict和set)的接口保持一致。
- n值为一个整数,或是一个实现了__index__()的对象。n值为0或负数将清空序列。序列中的项不会被拷贝,它们会被多次引用。
列表:
列表是可变序列,通常用于存放同类项目的集合
class list[iterable]
可以用多种方式构建列表:
- 使用一对方括号来表示列表:[]
- 使用方括号,其中的项以逗号分隔:[a],[b],[a,b,c]
- 使用列表推导式:[x for x in iterable]
- 使用类型的构造器:list()或list(iterable)
构造器将构造一个列表,其中的项与iterable中的项具有相同的值与顺序。iterable可以是序列、支持迭代的容器或其它迭代对象。如果Iterable已经是一个列表,将创建并返回其副本,类似于iterable[:]。例如,list('abc')返回['a','b','c']而list((1,2,3))返回[1,2,3]。如果没有给出参数,构造器将创建珍上空列表[]。
sort(*, key=None, reverse=False)
此方法会对列表进行原地排序,只使用< 来进行各项比较。异常不会被屏蔽--如果有任何比较操作失败,整个排序操作将失败(而列表可能会处于被部分修改的状态)。
sort(),接受两个仅限以关键字形式传入的参数(仅限关键字参数)
key 指定带有一个参数的函数,用于从每个列表元素中提取比较键(例如key=str.lower)。对应于列表中每一项的键会被计算 一次,然后在整个排序过程中使用。默认值 None表示直接对列表项排序而不计算一个单独的键值。
reserse为一个而尔值。如果设为True,则每个列表元素将按反向顺序比较进行排序。
当顺序大尺寸序列时此方法会原地修改该序列以保证空间经济性。为提醒用户此操作是通过间接影响进行的,它并不会返回排序后的序列。
元组
无组是不可变序列,通常用于储存异构数据的多项集(例如由enumerate()内置函数所产生的二元组),元组也被用于需要同构数据的不可变序列的情况(例如允许存储到set或dict的实例)。
class tuple([iterable])
可以用多种方式构建元组:
- 使用一对圆括号来表示空元组:()
- 使用一个后缀逗号来表示单元组:a,或(a,)
- 使用以逗号分隔的多个项:a,b,c or (a,b,c)
- 使用内置的tuple():tuple()或tuple(iterable)
构造器将构造一个元组,其中的项与iterable中的项具有相同的值与顺序。iterable可以是序列、支持迭代的容器或其他可迭代对象。如果iterable已经是一个元组,会不加改变的将其返回,例如,tupel('abc')返回(‘a’,'b','c')而tupel([1,2,3])返回(1,2,3),如果没有给出参数,构造器将创建一个空元组()。
请注意决定生成元组的其实是逗号而不是圆括号。圆括号只是可选的,生成空元组或需要避免语法歧义的情况除外。例如,f(a,b,c)在调用函数时附带三个参数,而f((a,b,c))则是在调用函数时附带一个三元组。
元组实现了所有一般序列的操作。
range对象
range 类型表示不可变的数字序列,通常用于在for循环中循环指定的次数。
class range(stop)
class range(start,stop[, step])
range构造器的参数必须为整数(可以是内置的int或任何实现了__index__特殊方法的对象)。
如果省略step参数, 其默认值为1。如果省略start参数,其默认值为0, 如果step为0则会引发ValueError。
如果step为正值,确实range 内容的公式为r[i]=start+step*i,其中 i>=0 且 r[i] < stop。
如果step为负值,确定range内容的公式仍然为r[i] = start + step*i,但限制条件改为i>=0且r[i]>stop。
如果r[0]不符合值的限制条件,则该range对象为空。range对象确实支持负索引,但是会将其解读为从正索引所确定的序列的末尾开始索引。
元素绝对值大于sys.maxsize的range对象是被允许的,但某些特笥可能引发OverflowError。
示例: