4.6 序列操作
Python支持大量针对序列的操作,包括有字符串,列表与表列。有一些操作也可以应用到所有的容器对象(如Set、Dictionary,它们都不是序列对象),有一些操作也可以应用到所有的可迭代对象(即指任意一个你可以循环的对象)。所有的容器对象,包括有序列与可迭代对象,而可迭代对象中又包括许多非容器对象,如File对象与Generator对象。
所以在以下的章节中,我们将精确地使用序列、容器与可迭代对象来描述与它们相关的操作。
4.6.1 普通序列
序列是指可以通过索引或片断来访问元素的容器。
内含的元素个数 = len(任意容器对象)
最小的元素 = min(其元素支持比较操作的任意非空可迭代对象)
最大的元素 = max(其元素支持比较操作的任意非空可迭代对象)
min,max函数还可以传入多个参数,返回这个参数中的最大值或最小值。
累计值 = sum(其元素为数字的任意非空可迭代对象)
4.6.1.1 序列转换
除了从普通字符串转换到Unicode字符串外,在不同类型的序列间不存在任何默认类型转换。使用一个可迭代对象作为参数调用内置类型list或tuple可以创建一个新的序列,其中包含的元素以及元素的顺序与调用参数完全一致。
4.6.1.2连接与重复
使用+可以连接两个相同类型的序列。使用*,如针对序列S,S*n的结果就是将S重复n次并连接在一起,若n<0,则结果是一个与S同类型的空序列。
4.6.1.3 成员检测
x in S 用来检测x是否等于S(可以是序列、容器、或可迭代对象)中的任意元素。而针对字符串S,此表达式意味着子串检测,而不只是单一字符。
4.6.1.4 索引
序列S中的第n个元素通过S[n]来表示,n是以0为基数的。
若n为负数,则S[n] = S[L + n],其中L指S的大小。
若n>=L 或n<-L,则抛出异常。
x = [1, 2, 3, 4]
x[1] # 2
x[-1] # 4
4.6.1.5 序列片断
针对一个序列S,其大小为L,使用片断可以表示一个子序列,S[i,j],其中i,j为整数,表示S的一个子序列,从第i个元素开始(包括第i个元素),到第j个元素结束(不包括第j个元素)。若j小于等于i,或i大于等于L,则此子序列为空序列。
若i等于0,则可以忽略i,如S[:j]。若j大于等于L,则可以忽略j,如S[i:]。当然,若同时忽略i与j,如S[:],则表示这是原序列的一个拷贝。
针对i与j,也可以使用负数,其意义与索引完全一致。若n<0,则第n个元素为第L+n个元素。
x = [1, 2, 3, 4]
x[1:3] # [2, 3]
x[1:] # [2, 3, 4]
x[:2] # [1, 2]
另一形式的序列片断称为扩展片断为S[i:j:k],其中k为步长。
S[i:j] = S[i:j:1],S[::2]为只包括偶数位元素的子序列,S[::-1]为反序列。
4.6.2 字符串
字符串是不可变对象,试图重绑定或删除它的元素或片断都会引发异常。字符串的元素是长度为1的字符串,字符串的片断也是字符串。
4.6.3 表列Tuple
表列是不可变对象,试图重绑定或删除它的元素或片断都会引发异常。表列的片断也是表列。表列中可以存储任意类型的任意对象。
4.6.4 列表
列表是可变对象,可以重绑定或删除它的元素或片断。列表的片断也是列表。列表中可以存储任意类型的任意对象。
4.6.4.1 修改列表
可以通过索引来修改列表的值。
x = [1, 2, 3, 4]
x[1] = 42 # x is now [1, 42, 3, 4]
在赋值语句中,将列表片断作为左值也可以修改列表的值,而右值必须是一个可迭代对象。
对于扩展模式的片断(S[i:j:k]),左值与右值必须拥有相同个数的元素。
对于普通模式的片断(S[i:j]),则没有此限制,通过赋值可以在列表中添加或移除元素。
x = [1, 2, 3, 4]
x[1:3] = [22, 33, 44] # x is now [1, 22, 33, 44, 4]
x[1:4] = [8, 9] # x is now [1, 8, 9, 4]
一些特殊的用法如下所示:
右值为空的列表片断可以移除左值序列片断中的所有元素,即L[i:j]=[]等同于del L[i:j]。
左值为空的列表片断可以添加右值序列片断中的所有元素,即L[i:i]=[a,b]等同于将a,b元素插入到L中第i元素之前。
使用包括整个列表的片断作为左值(L[:]),将会替换整个列表。
使用del可以移除序列中的元素或片断。
4.6.4.2 内置操作
L += L1,将L1添加到L的尾部。
L *= n,将L拷贝n-1次,并添加到L的尾部。若n小于等于0,则清空L,相当于L[:]=[]。
4.6.4.3 列表方法
列表对象拥有一组方法:
非改变方法(不改变应用方法的对象):
L.count(x)
返回与x相等的元素个数。
L.index(x)
返回第一个与x相等的元素索引。若没有相符的元素,则抛出异常。
改变方法(将会改变应用此方法的对象,除pop方法外均返回None):
L.append(x)
添加x到L的尾部。L[len(L):]=[x]
L.extend(s)
将可迭代对象s中的所有元素都添加到L的尾部。L[len(L):]=s
L.insert(i, x)
将x插入到第i个元素之前,之后的元素都将会被右移一位。L[i:i]=[x]
L.remove(x)
移除L中第一个与x相等的元素。若没有相符的元素,则抛出异常。
L.pop([i])
返回第i个元素,并将其从L中移除。若没有指定索引i,则处理最后一个元素。若L为空或i超出合法范围,则抛出异常。
L.reverse( )
反转L中的元素。
L.sort([f]) (2.3)
对L进行排序,使用函数f来进行元素比较。若没有指定f,则使用Python内置方法cmp。
L.sort(cmp=cmp, key=None, reverse=False)(2.4)
对L进行排序,使用函数f来进行元素比较。若k不为None,则用来进行比较的不是L中的元素x本身,而是key(x)的值。
4.6.4.4 列表排序
列表的sort方法使用非常好的算法,所以拥有不可思义的排序速度。
在python2.3中,sort方法可以接受一个参数,来增加排序的灵活性,这会降低操作速度。这个比较函数针对小于、等于、大于分别返回-1、0、1。我们还有一个decorate-sort-undecorate方法可以在保证速度的前提下,增加灵活性,并降低出错的可能。
在python2.4中,sort方法可以接受三个参数,第一个参数还是用来提供比较算法,第二个参数则是一个映射函数,若对元素x,y排序,若指定了参数k,则不是直接比较x,y,而是比较k(x)与k(y)。
在python2.4中,提供了一个新的sorted方法,它接受可迭代对象,并产生一个排序的结果列表。
此外,在python2.4中,在operator模块中提供了两个新函数:attrgeter与itemgetter。可以用它们来生成相应的可调用对象,可以在排序函数sort或sorted中当作k参数来使用。
在python2.5中,为了实现相同的灵活比较机制,对于内置的min与max函数,以及heapq模块中的nsmallest与nlargest函数,也增加了相应的key参数。
&spm=1001.2101.3001.5002&articleId=1485756&d=1&t=3&u=3dfea57fef2048188e1801e29b3f93d8)
1324

被折叠的 条评论
为什么被折叠?



