Python in Nutshell 简明翻译(4)

4.6 序列操作

Python支持大量针对序列的操作,包括有字符串,列表与表列。有一些操作也可以应用到所有的容器对象(如SetDictionary,它们都不是序列对象),有一些操作也可以应用到所有的可迭代对象(即指任意一个你可以循环的对象)。所有的容器对象,包括有序列与可迭代对象,而可迭代对象中又包括许多非容器对象,如File对象与Generator对象。

所以在以下的章节中,我们将精确地使用序列、容器与可迭代对象来描述与它们相关的操作。

4.6.1 普通序列

序列是指可以通过索引或片断来访问元素的容器。

内含的元素个数 = len(任意容器对象)

最小的元素 = min(其元素支持比较操作的任意非空可迭代对象)

最大的元素 = max(其元素支持比较操作的任意非空可迭代对象)

minmax函数还可以传入多个参数,返回这个参数中的最大值或最小值。

累计值 = sum(其元素为数字的任意非空可迭代对象)



4.6.1.1 序列转换

除了从普通字符串转换到Unicode字符串外,在不同类型的序列间不存在任何默认类型转换。使用一个可迭代对象作为参数调用内置类型listtuple可以创建一个新的序列,其中包含的元素以及元素的顺序与调用参数完全一致。

4.6.1.2连接与重复

使用+可以连接两个相同类型的序列。使用*,如针对序列SS*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],其中LS的大小。

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:]。当然,若同时忽略ij,如S[:],则表示这是原序列的一个拷贝。

针对ij,也可以使用负数,其意义与索引完全一致。若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)

添加xL的尾部。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方法可以接受一个参数,来增加排序的灵活性,这会降低操作速度。这个比较函数针对小于、等于、大于分别返回-101。我们还有一个decorate-sort-undecorate方法可以在保证速度的前提下,增加灵活性,并降低出错的可能。

python2.4中,sort方法可以接受三个参数,第一个参数还是用来提供比较算法,第二个参数则是一个映射函数,若对元素x,y排序,若指定了参数k,则不是直接比较x,y,而是比较k(x)k(y)

python2.4中,提供了一个新的sorted方法,它接受可迭代对象,并产生一个排序的结果列表。

此外,在python2.4中,在operator模块中提供了两个新函数:attrgeteritemgetter。可以用它们来生成相应的可调用对象,可以在排序函数sortsorted中当作k参数来使用。

python2.5中,为了实现相同的灵活比较机制,对于内置的minmax函数,以及heapq模块中的nsmallestnlargest函数,也增加了相应的key参数。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值