2.1序列概览
python内建序列:列表,元组,字符串,Unicode字符串,buffer对象,xrange对象。
列表,元组区别:列表可以修改,元组不可。使用元组作为字典的键,因为键不可修改,所以不能使用列表。
2.2通用序列操作
2.2.1 索引
序列中所有元素都是有编号的,从0开始。所有元素都可以通过编号分别访问。使用负数,Python会从最后一个元素 开始计数。
例如:
>>> greeting = 'Hello'
>>> greeting[0]
'H'
>>> 'Hello'[1]
'e'
>>>fourth = raw_input('Year: ')[3]
Year:2005
>>>fourth
'5'
2.2.2分片
索引访问某个元素,分片可以访问一定范围内的元素。通过冒号相隔的两个索引来实现:
>>>number = [1,2,3,4,5,6,7,8,9,10]
>>>number[x:y:z]
x:表示从第x个元素开始;y:表示到第y个元素结束;z:表示取出的两个元素相隔为z。x,y无值时,表示从第0个到最后一个,要有冒号分割。
xy可以为负数,表示从结尾向前数。z也可以为负数,表示反向。
.2.2.3序列相加
两种相同类型的序列才能进行连接操作。
2.2.4乘法
数字N乘以一个序列会生成新的序列,使序列被重复N次。
NONE.空列表,和初始化
空列表([]),
>>>sequence = [None]*10
>>>sequence
[None,None,None,None,None,None,None,None,None,None]
2.2.5成员资格
in可以检查一个值是否在序列中,条件为真时,返回True,假时返回False.
database = [
['albert','1234'],
['dilbert','2345'],
['smith','3456'],
['jones','4567']
]
username = raw_input('User name: ')
pin = raw_input('PIN code: ')
if [username,pin] in database: print 'Access granted'
else: print 'Wrong Username or Password'
2.2.6长度,最小值,最大值
内建函数len,min,max。
>>>number = [10,34,65]
>>>len[number]
3
>>>max[number]
65
>>>min[4,6,2,5]
2
2.3列表:python的苦力
2.3.1list函数
字符串不能向列表一样被修改,有时根据字符串创建列表会很有用。
>>> list('hello')
['h', 'e', 'l', 'l', 'o']
>>> ''.join(list('hello'))
'hello'
list用于所有类型的序列,而不只是字符串。
2.3.2基本的列表操作
列表可以使用所有序列的标准操作,如索引,连接和乘法。列表是可以修改的。改变的方法有:元素赋值,元素删除,分片赋值以及列表方法。注意不是所有的列表方法都真正的改变列表。
1 改变列表,元素赋值
>>> x = [1,1,1,1]
>>> x[2] = 2
>>> x
[1, 1, 2, 1]
2 删除元素
>>> names = ['Alice','Berk','Carl','David','Echo']
>>> del names[4]
>>> names
['Alice', 'Berk', 'Carl', 'David']
3 分片赋值
>>> name = list('Perl')
>>> name
['P', 'e', 'r', 'l']
>>> name[2:] = list('ar')
>>> name
['P', 'e', 'a', 'r']
分片可以使用与原序列不等长的序列将分片替换
>>> name = list('Perl')
>>> name
['P', 'e', 'r', 'l']
>>> name[1:] = list('ython')
>>> name
['P', 'y', 't', 'h', 'o', 'n']
分片赋值可以在不需要替换任何原有元素的情况下插入新的元素
>>> number = [1,5]
>>> number[1:1] = [2,3,4]
>>> number
[1, 2, 3, 4, 5]
上面的例子只是替换了一个空的分片,因此实际的操作是插入了一个序列,以此类推,通过分片赋值来删除元素也是可行的。
>>> number
[1, 2, 3, 4, 5]
>>> number[1:4] = []
>>> number
[1, 5]
其实也可以尝试使用步长或者负数来删除元素。
2.3.3 列表方法
方法是一个与某些对象有紧密联系的函数,对象可能是列表,数字,也可能是字符串或者其他类型的对象,一般来说,方法可以这样调用。对象.方法(参数)
1 append
>>> lst = [1,2,3]
>>> lst.append(4)
>>> lst
[1, 2, 3, 4]
list 是内建函数,所以用了lst。append方法直接修改原来的列表。
2 count 统计某个元素在列表中出现的次数
>>> ['to','be','or','not','to','you'].count('to')
2
>>> x = [[1,2],1,2,1,[1,2,[2,1]]]
>>> x.count(1)
2
>>> x.count([1,2])
1
3 extend 可以在列表的末尾一次性追加另一个序列中的多个值。
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]
extend方法很象连接操作,区别在于:extend方法修改了原来的序列,而连接操作则返回一个全新的列表。
4 index index方法用于从列表中找出某个值第一个匹配项的索引位置。
>>> knight = ['we','are','the','knight','who','say','hi']
>>> knight.index('who')
4
>>> knight[4]
'who'
5 insert insert方法用于将对象插入到列表中:
>>> number = [1,2,3,5,6]
>>> number.insert(3,'four')
>>> number
[1, 2, 3, 'four', 5, 6]
与extend方法一样,insert方法也可以使用分片赋值来实现。
>>> number = [1,2,3,5,6]
>>> number[3:3] = ['four']
>>> number
[1, 2, 3, 'four', 5, 6]
>>> number = [1,2,3,5,6]
>>> number[3:4] = ['four','five']
>>> number
[1, 2, 3, 'four', 'five', 6]
6 pop pop方法会移除列表的一个元素(默认最后一个),并且返回该元素的值。
>>> x = [1,2,3]
>>> x.pop()
3
>>> x.pop(0)
1
>>> x
[2]
pop方法是唯一一个既能修改列表又返回元素值(除了None)的列表方法。
pop方法可以实现一种常见的数据结构--栈。后进先出,LIFO原则。
>>> x = [1,2,3]
>>> x.append(x.pop())
>>> x
[1, 2, 3]
7 remove 此方法用于移除列表中某个值的第一个匹配项。其删除后无返回值,与pop相反。
>>> x = ['to','be','or','not','to','be']
>>> x.remove('be')
>>> x
['to', 'or', 'not', 'to', 'be']
>>> x.remove('bee')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
8 reverse 此方法将列表中的元素反向存放,改变列表但是不返回值。其返回一个迭代器(iterator),可以使用list函数把返回的对象转换成列表也是可行的。
>>> x = [1,2,3,4,5,6,7]
>>> x.reverse()
>>> x
[7, 6, 5, 4, 3, 2, 1]
>>> x = [1,2,3,4,5]
>>> list(reversed(x))
[5, 4, 3, 2, 1]
9 sort 此方法用于在原位置对列表进行排序。改变原来的序列。
>>> x = [1,3,6,4,2,5]
>>> x.sort()
>>> x
[1, 2, 3, 4, 5, 6]
如果想要保存原文件,可以先把x的副本赋值给y,然后对y进行排序。
>>> x = [1,3,6,4,2,5]
>>> y = x[:]
>>> y.sort()
>>> y
[1, 2, 3, 4, 5, 6]
>>> x
[1, 3, 6, 4, 2, 5]
请注意,上述的例子再次调用x[:],这是一种很有效率复制整个列表的方法,只是简单的把x赋值给y是没用的。因为这样就让x和y都指向同一个列表了。
>>> x = [1,3,6,4,2,5]
>>> y = x
>>> y.sort()
>>> y
[1, 2, 3, 4, 5, 6]
>>> x
[1, 2, 3, 4, 5, 6]
另一种获取已排序的列表的副本的方法是,使用sorted函数。
>>> x = [1,3,6,4,2,5]
>>> y = sorted(x)
>>> x
[1, 3, 6, 4, 2, 5]
>>> y
[1, 2, 3, 4, 5, 6]
sorted函数可以用于任何序列,却总是返回一个列表:
>>> sorted('Python')
['P', 'h', 'n', 'o', 't', 'y']
10 高级排序 希望元素能按照特定的方式排序,而不是默认的方式,即根据python的默认排序则按照升序排列。可以通过compare(x,y)的形式自定义比较函数,compare(x,y)函数会在x<y时返回负数,在x>y时返回正数,如果x=y则返回0(根据你的定义)。定义好该函数之后,就可以提供给sort方法作为参数了,内建函数cmp提供了比较函数的默认方式。
>>> cmp(0,0)
0
>>> cmp(20,10)
1
>>> cmp(20,30)
-1
>>> number = [5,2,9,7]
>>> number.sort(cmp)
>>> number
[2, 5, 7, 9]
sort方法有另外两个可选的参数,key和reverse。如果要使用它们,就要通过名字来指定。叫做关键字参数。参数key与cmp类似,必须提供一个在排序过程中使用的函数。该函数并不是直接用来确定对象的大小,而是为每个元素创建一个键,然后所有元素根据键来排序。
>>> x = ['aabudh','dasfdsdag','ddgrte','eret','ddf']
>>> x.sort(key=len)
>>> x
['ddf', 'eret', 'aabudh', 'ddgrte', 'dasfdsdag']
另一个关键字参数reverse是简单的布尔值,用来说明列表是否要进行反向排序。
>>> x = [4,6,2,1,7,9,23]
>>> x.sort(reverse=True)
>>> x
[23, 9, 7, 6, 4, 2, 1]
2.4 元组:不可变序列
元组与列表一样,是一种序列,只是元组不能修改。只需要用逗号分隔一些值,就创建了元组。
>>> 1,2,3,4
(1, 2, 3, 4)
>>> (1,2,3,4,5)
(1, 2, 3, 4, 5)
>>> ()
()
空元组用没有内容的圆括号来表示。
>>> 3*(40+2)
126
>>> 3*(40+2,)
(42, 42, 42)
圆括号和逗号共同组建了元组,少了任何一个都不能成立。
2.4.1 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)
元组的意义:1.可以在映射(和集合的成员)中当作键使用,而列表不行。
2.元组作为很多内建函数和方法的返回值存在,也就是说你必须要对元组进行处理。只要不尝试修改元组,那么,“处理”元组在绝大多数情况下就是把他们当作列表来进行操作(除非需要使用一些元组没有的方法,例如index和count),一般来说列表可能更能满足对序列的所有要求。