2.1序列概览
列表和元组的主要区别在于,列表可以修改,元组则不能。也就是说如果要根据要求来添加元素,那么列表可能会更好用;而出于某些原因,序列不能修改的时候,使用元组则更为合适。使用后者的理由通常是技术性的,它与Python内部的运作方式有关。这也是内建函数可能返回元组的原因。一般来说,在几乎所有的情况下列表都可以替代元组。
编写一个列表:
>>> edward=['Edward Gumby',42]
构建如下的一个人员信息的列表也是可以的,这个列表就是你的数据库:
>>> john=['John Simith',50] >>> database=[edward,john] >>> database [['Edward Gumby', 42], ['John Simith', 50]]
2.2通用序列操作
所有序列类型都可以进行某些特定的操作。这些操作包括:索引(indexing)、分片(sliceing) ,加(adding )、乘(multiplying)以及检查某个元素是否属于序列的成员(成员资格)。除此之外,Python还有计算序列长度、找出最大元素和最小元素的内建函数。
2.2.1索引
序列中的所有元素都是有编号的—从0开始递增。这些元素可以通过编号分别访问:
>>> greeting='Hello'
>>> greeting[0]
'H'
字符串字面值(就此而言,其他序列字面量亦可)能够直接使用索引,而不需要一个变量引用他们。
>>> 'Hello'[1]
'e'
如果一个函数调用返回一个序列,那么可以直接对返回结果进行索引操作。
>>> fourth=raw_input('Year:')[3]
Year: 2025
>>> fourth
'5'
实例:
#根据给定的年月日以数字形式打印出日期
>>> months=[
'January',
'February',
"March",
'April',
'May',
'June',
'July',
'Augest',
'September',
'October',
'November',
'December'
]
#以1一31的数字作为结尾的列表
endings=['st','nd','rd']+17*['th']\
+['st','nd','rd']+7*['th']\
+['st']
year=raw_input('Year:')
month=raw_input('Month(1-12:')
day=raw_input('Day(1-31):')
month_number=int(month)
day_number=int(day)
#要将月份和天数减1,以获得正确的索引
month_name=months[month_number-1]
ordinal=day+endings[day_number-1]
print month_name+''+ordinal+''+year
Year: 2015
Month(1-12:>? 5
Day(1-31):>? 13
May13th2015
2.2.2分片
与使用索引来访问单个元素类似,可以使用分片操作来访问一定范围内的元素。
>>> tag='https://d396qusza40orc.cloudfront.net/statistics'
>>> tag[23:37]
'cloudfront.net'
分片操作对于提取序列的一部分是很有用的。而编号在这里显得尤为重要。第1个索引是需要提取部分的第1个元素的编号,而最后的索引则是分片之后剩下部分的第1个元素的编号:
>>> numbers=[1,2,3,4,5,6,7,8,9]
>>> numbers[3:6]
[4, 5, 6]
简而言之,分片操作的实现需要提供两个索引作为边界,第1个索引的元素是包含在分片内的,而第2个则不包含在分片内。
1.优雅的捷径
假设需要访问最后3个元素(根据先前的例子),那么当然可以进行显式的操作:
如果分片所得部分包括序列结尾的元素,那么,只需置空最后一个索引即可:
>>> numbers[-3:]
[7, 8, 9]
这种方法同样适用于序列开始的元素:
>>>numbers[:3]
[1,2,3]
2.3列表
2.3.1list函数
>>> list('hello')
['h', 'e', 'l', 'l', 'o']
2.3.2基本的列表操作
1.改变列表:元素赋值
>>> x=[1,1,1]
>>> x[1]=2
>>> x
[1, 2, 1]
2.删除元素
>>> names=['alice','beth','cecil','dee-dee','earl']
>>> del names[2]
>>> names
['alice', 'beth', 'dee-dee', 'earl']
3.分片赋值
>>> name=list('Perl')
>>> name
['P', 'e', 'r', 'l']
>>> name[2:]=list('ar')
>>> name
['P', 'e', 'a', 'r']
可以使用与原序列不等长的序列将分片替换:
>>> name=list('Perl')
>>> name[1:]=list('ython')
>>> name
['P', 'y', 't', 'h', 'o', 'n']
可以在不需要替换任何原有元素的情况下插入新的元素
>>> numbers=[1,5]
>>> numbers[1:1]=[2,3,4]
>>> numbers
[1, 2, 3, 4, 5]
2.3列表方法
1.append
>>> lst=[1,2,3]
>>> lst.append(4)
>>> lst
[1, 2, 3, 4]
2.count
>>> ['to','be','or','not','to','be'].count('to')
2
>>> x=[[1,2],1,1,[2,1,[1,2]]]
>>> x.count(1)
2
>>> x.count([1,2])
1
3.extend
>>> a=[1,2,3]
>>> b=[3,4,5]
>>> a.extend(b)
>>> a
[1, 2, 3, 3, 4, 5]
>>> a=a+b效果相同
4.index
>>> knights=['we','are','the','knights','who','say','ni']
>>> knights.index('who')
4
>>> knights[4]
'who'
5.insect
>>> numbers=[1,2,3,5,6,7]
>>> numbers.insert(3,'four')
>>> numbers
[1, 2, 3, 'four', 5, 6, 7]
6.pop
移除列表中的一个元素,默认是最后一个
>>> x=[1,2,3]
>>> x.pop()
3
>>> x
[1, 2]
7.remove
>>> x=['to','be','or','not','to','be']
>>> x.remove('be')
>>> x
['to', 'or', 'not', 'to', 'be']
8.reverse
>>> x=[1,2,3]
>>> x.reverse()
>>> x
[3, 2, 1]
9.sort
>>> x=[4,5,3,1,7]
>>> x.sort()
>>> x
[1, 3, 4, 5, 7]
>>> x=[4,5,3,1,7]
>>> y=x[:]
>>> y.sort()
>>> x
[4, 5, 3, 1, 7]
>>> y
[1, 3, 4, 5, 7]
>>> y=x.sort()
>>> print y
None
应该是:
>>> x=[4,5,3,1,7]
>>> y=x[:]
>>> y.sort()
>>> x
[4, 5, 3, 1, 7]
>>> y
[1, 3, 4, 5, 7]
获取已排序的列表副本:
>>> x=[4,5,3,1,7]
>>> y=sorted(x)
>>> x
[4, 5, 3, 1, 7]
>>> y
[1, 3, 4, 5, 7]
10.高级排序
compare(x.y)函数会在x<y时返回负数,在x>y时返回正数,如果x=y则返回0
>>> cmp(40,33)
1
>>> cmp(33,40)
-1
>>> numbers=[5,2,9,7]
>>> numbers.sort(cmp)
>>> numbers
[2, 5, 7, 9]
2.4元组:不可变序列
如果你用逗号分隔了一些值,那么你就自动创建了元组。
>>> 1,2,3
(1, 2, 3)
>>> ()#空元组
()
2.4.1tuple函数
tuple函数的功能与list函数基本上是一样的:以一个序列作为参数并把它转换
为元组。
>>> tuple([1,2,3])
(1, 2, 3)
>>> tuple('abc')
('a', 'b', 'c')
2.4.2基本元祖操作
大致和序列类似
2.4.3元组的意义
元组可以在映射(和集合的成员)中当作键使用—而列表则不行元组作为很多内建函数和方法的返回值存在,也就是说你必须对元组进行处理。只要不尝试修改元组,那么,“处理”元组在绝大多数情况下就是把它们当作列表来进行操作(除非需要使用一些元组没有的方法,例如index和count一般来说,列表可能更能满足对序列的所有需求。
2.5小结
cmp(x, y)比较两个值
len(seq)返回序列的长度
list(seq)把序列转换成列表
max(args)返回序列或者参数集合中的最大值
min(args)返回序列或者参数集合中的最小值
reversed(seq)对序列进行反向迭代
sorted(seq)返回已排序的包含seq所有元素的列表
tuple(seq)把序列转换成元组