2.1 序列概览
- python包含六种内建的序列,本章主要讨论列表和元组。其他的内建序列类型有字符串,Unicode字符串,buffer对象和xrange对象。列表和元组的主要区别是列表可以被修改,元组不能。
列表举例:
>>>edward = ['Edward Gumby',42]
序列也可以包含其他的序列,例如:
>>>edward = ['Edward Gumby' , 42]
>>>john = ['John Smith' , 50]
>>>database = [edward,john]
>>>database
[['Edward Gumby', 42],['John Smith' , 50]]
2.2 通用序列操作
- 所有序列都可以进行某些特定操作,包括:索引,分片,加,乘以及检查某个元素是否属于序列的成员。除此之外,python还有计算序列长度,找出最大元素和最小元素的内建函数。
2.2.1 索引
- 序列中元素都是有编号的,从0开始递增,最后一个元素的位置编号是-1。
>>>fourth = raw_input('Year: ')[3]
Year: 2005
>>>fourth
'5'
2.2.2 分片
- 可以使用分片操作来访问一定范围内的元素,通过冒号相隔的两个索引来实现。第一个索引是需要提取部分的第1个元素的编号,而最后的索引是分片之后剩下部分的第1个元素的编号(第2个不包含在分片内)。
>>>tag = '<a href="http://www.python.org">Python web site</a>'
>>>tag[9:30]
'http://www.python.org'
>>>tag[32:-4]
'Python web site'
-访问最后三个元素的技巧:
>>>numbers = [1,2,3,4,5,6,7,8,9,10]
>>>numbers[7:10]
[8,9,10]
>>>numbers[-3:-1]
[8,,9] #从结尾开始计数,不行
>>>numbers[-3,0]
[] #返回空列表
>>>numbers[-3:]
[8,9,10]
>>>numbers[:3]
[1,2,3]
>>>numbers[:]
[1,2,3,4,5,6,7,8,9,10] #返回整个列表
- 更大的步长
>>>numbers[0:10:1]
[1,2,3,4,5,6,7,8,9,10]
>>>numbers[0:10:2]
[1,3,5,7,9]
>>>numbers[::4]
[1,5,9]
2.2.3 序列相加
- 两种同种类型的序列才可以进行连接操作。
>>>[1,2,3]+[4,5,6]
[1,2,3,4,5,6]
>>>'hello ' + 'world'
'hello world'
2.2.4 乘法
>>>'python' * 5
'pythonpythonpythonpythonpython'
>>>[42] * 10
[42,42,42,42,42,42,42,42,42,42]
>>>sequence = [None] * 10
>>>sequence
[None,None,None,None,None,None,None,None,None,None]
2.2.5 成员资格
- in运算符检查元素是否在序列中
>>>permissions = 'rw'
>>>'w' in permissions
True
>>>subject = '$$$ Get rich now!!! $$$'
>>>'$$$' in subject
True
长度、最小值和最大值
- len函数返回序列中所包含元素的数量,min函数和max函数返回序列中最大和最小的元素
2.3 列表:python的”苦力“
2.3.1 基本的列表操作
- 改变列表:元素赋值。不能为一个位置不存在的元素赋值。
>>>x = [1,1,1]
>>>x[1] = 2
>>>x
[1,2,1]
- 删除元素
>>>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']
分片赋值可以不需要替换任何原有元素的情况下插入新的元素。
>>>numbers = [1,5]
>>>numbers[1:1] = [2,3,4]
>>>numbers
[1,2,3,4,5]
也可以用来删除元素
>>>numbers
[1,2,3,4,5]
>>>numbers[1:4] = []
>>>numbers
[1,5]
2.3.3 列表方法
方法是一个与某些对象有紧密联系的函数,对象可能是列表,数字,也可能是字符串或者其他类型的对象。一般方法可以这样调用:对象.方法(参数)
1. append:用来在列表末尾追加新的对象
>>>lst = [1,2,3]
>>>lst.append(4)
>>>lst
[1,2,3,4]
append不是简单返回一个修改过的新列表,而是直接修改原来的列表。
2. count:用来统计某个元素出现的次数
>>>x = [[1,2],1,1,[2,1,[1,2]]]
>>>x.count(1)
2
>>>x.count([1,2])
1
- extend:在末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
>>>a = [1,2,3]
>>>b = [4,5,6]
>>>a.extend(b)
>>>a
[1,2,3,4,5,6]
这个与连接操作不同,连接操作+返回一个新列表,而extend是在原列表上面修改。
4. index:从列表找出某个值第一个匹配项的索引位置
>>>knights = ['we','are','knights','who','say','ni']
>>>knights.index['who']
4
- insert:将对象插入到列表中
>>>numbers = [1,2,3,5,6,7]
>>>numbers.insert(3,'four')
>>>numbers
[1,2,3,'four',5,6,7]
- pop:移除最后一个元素,并返回该元素的值
>>>x = [1,2,3]
>>>x.pop()
3
>>>x
[1,2]
>>>x.pop(0)
1
>>>x
[2]
7.remove: 用于移除列表中某个值的第一个匹配项
>>>x = ['to','be','or','not','to','be']
>>>x.remove('be')
>>>x
['to','or','not','to','be']
- reverse:将列表中元素反向存放
>>>x = [1,2,3]
>>>x.reverse()
>>>x
[3,2,1]
- sort:在原位置对列表进行排序(即改变原来的列表),但是返回空值
>>>x = [4,6,2,1,7,9]
>>>x.sort()
>>>x
[1,2,4,6,7,9]
如果需要一个排好序的列表副本,不可以这样:
>>>x = [4,6,2,1,7,9]
>>>y = x.sort()
>>>print y
None
可以将x的副本赋值给y,再对y排序
>>>x = [4,6,2,1,7,9]
>>>y = x[:] # 不能用y = x,否则y和x都指向同一个列表了
>>>y.sort()
>>>x
[4,6,2,1,7,9]
>>>y
[1,2,4,6,7,9]
- 高级排序
首先自定义比较函数compare(x,y),然后提供给sort函数作为参数。sort函数还有另外两个可选参数,key和reverse。参数key需要提供一个在排序中使用的函数,为每个元素创建一个键,然后所有元素根据键来排序。另一个参数reverse是简单的布尔值,指明是否要进行反向排序。
2.4 元组:不可变序列
- 元组和列表一样,也是一种序列,只是不能修改。(字符串也是如此)创建元组很简单,用逗号分隔开一些值就创建了元组
>>>1,2,3
(1,2,3)
- 元组大部分时候是用圆括号括起来的
>>>(1,2,3)
(1,2,3)
- 加个逗号可以实现只有一个值的元组
>>>42
42
>>>42,
(42,)
>>>(42,)
(42,)
>>>3*(40+2)
126
>>>3*(40+2.)
>>>(42,42,42)
2.4.1 tuple函数
- tuple函数与list函数基本是一样的,以一个序列作为参数把它转化为元组。
>>>tuple([1,2,3])
(1,2,3)
>>>tuple('abc')
('a','b','c')
>>>tuple((1,2,3))
>>>(1,2,3)
2.4.2 基本元组操作
>>>x = 1,2,3
>>>x[1]
2
>>>x[0:2]
(1,2)
2.4.3 意义
- 可以在映射中当做键使用——列表不行
- 作为很多内建函数和方法的返回值存在,也就是说你必须对元组进行处理,只要不尝试修改元组,那么处理元组在绝大多数情况下就是把它们当做列表进行操作。
- 一般来说,列表更能满足对序列的所有需求
2.5 小结
- 序列
- 成员资格:in操作符可以检查一个值是否存在于序列中,对字符串使用in操作符可以查找子字符串
- 方法