数据结构,是通过某种方式(例如元素进行编号)组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构。
在Python中最基本的数据结构是序列。
1.概述
python内建序列,有6种:列表,元组,字符串,Unicode字符串,buffer对象和xrange对象。
列表和元组的区别在于,列表可修改(用于元素添加等操作),元组不可修改(与python内部运作方式有关,内建函数返回元组,使用元组作为字典的键)。
操作一组数值的时候,序列很好用,序列也可以包含其他序列,如下数据库:
>>>edward = ['Edward', 32]
>>>John = ['John', 12]
>>>database = [edward, John]
>>>database
[['Edward', 42], ['John' 12]]
容器,基本上是包含其他对象的任意对象,序列和映射(如字典)是两类主要容器,序列的每个元素都有自己的编号,而映射中每个元素都有一个名字(键),
至于既不是序列也不是映射的容器类型,集合(set)为一个举例。
2.通用序列操作
索引(index),分片(sliceing),加(adding),乘(multplying)以及检查某个元素是否属于序列的成员(成员资格),
计算序列长度,找出最大元素和最小元素的内建函数。
迭代(interation),对序列进行迭代的意思是,依次对序列中的每个元素重复执行某些操作。
2.1索引
序列编号从0开始递增,元素可通过编号访问
负数索引从最后一个元素开始计数,最后一个元素位置编号为-1
>>>greeting = 'Hello'
>>>greeting[0] 'H'
>>>greeting[-1] 'o'
或者字符串字面值方式直接使用索引
>>>'Hello'[0]
一个函数调用返回一个序列,可直接对返回结果进行索引
>>>forth = raw_input('Year: ')[3]
Year:2005
>>>forth
'5'
2.2分片
访问一定范围内的元素,通过冒号相隔两个索引
两个编号(需要提取的第一个元素编号,分片之后剩下部分的第一个元素编号)
number = [1,2,3,4]
访问最后3位元素, >>>number[-3,]
访问最初3位元素 >>>number[ ,3]
访问整个序列 number[;]
步长的显示设置
>>>number[0:10:2]
[1,3,5,7,9]
提取每四个元素中的第一个,将步长设置为4即可: >>>number[::4] [1,5,9]
步长不能为0,但是可以为负数,表示从右向左提取 >>>number[8:3:-1] [9,8,7,6,5]
>>>number[10,0,-2] [10,8,6,4,2] >>>number[0:10:-2] [ ] >>>number[: : -2] [10,8,6,4,2]
>>>number[5: : -2] [6,4,2] >>>number[ : 5: -2] [10, 8]
注意,开始点(第一个元素)的元素在结果中,结束点元素(第二个元素)不在结果中,负数做步长时,开始点要大于结束点
2.3序列相加
加号进行序列的连接操作。
>>>[1, 2, 3] + [4, 5, 6] [1, 2, 3, 4, 5, 6]
>>>'Hello, ' +'World' 'Hello, world'
列表和字符串无法连接在一起,两种同类型才可以连接
2.4乘法
用数字x乘以一个序列会生成新的序列,在新的序列中,原来的序列被重复x次
>>>'python' * 5 pythonpythonpythonpythonpython
>>>[42] * 5 [42, 42, 42, 42, 42]
空列表 [ ]
空值,没有放置任何元素,需要使用None,为python的内键值
初始化一个长度为10的空列表 >>>sequence = [None] * 10 >>>sequence [None, None, ...]
2.5成员资格
检查一个值是否在序列中, in 运算符
该运算符检查某个条件是否为真,然后返回相应值,条件为真返回True,为假返回False, 布尔运算符,真值为布尔值
>>>permission = 'rw' >>> 'w' in permissions True
>>> 'x' in permissions False 可用于检查文件可写可读权限
>>>users = ['mlh', 'foo', 'bar'] >>>raw_input{'Enter your user name;' ) in users Enter your user name: mlh True 检查用户名是否在列表中
>>>Subject = '$$$' Get rich now !!! $$$' >>>'$$$' in subject True 作为垃圾邮件过滤器的一部分,检查字符串subject是否包含字符串'$$$'
2.6长度,最大值和最小值
内建函数len, min, max 返回序列中所含元素的数量,min和max函数分别返回序列中最大最小元素
>>>numbers = [100, 200, 34]
>>>len(numbers) 3 >>>min(numbers) >>>max(2,3) 3 >>>min(3.6.2.1) 1
max和min直接以数字作为参数
3.列表
3.1 List函数
字符串不能修改,根据字符串创建列表,使用list实现
>>> list('hello') ['h', 'e', 'l', 'l', 'o']
list适用于所有类型的序列,不只是字符串
将列表转为字符串 ’ '. join(somelist)
3.2基本的列表操作
可以使用上述适用于序列的标准操作,还有一些改变列表的方法:元素赋值,元素删除,分片赋值以及列表方法
3.2.1改变列表:元素赋值
>>> x = [1, 1, 1] >>> x[1] = 2 >>> x [1, 2, 1]
3.2.2删除元素
>>>names = ['Alice', 'Beth', 'Cecil', 'Dee'] >>>del names[2] >>>names ['Alice', 'Beth', 'Dee']
3.2.3分片赋值
可以使用原序列不等长的序列将分片替换 >>>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]
删除元素 >>>numbers [1, 2, 3, 4,5] >>>numbers[1: 4] = [ ] >>>numbers [1, 5] >>>dele numbers[1 : 4]
3.3列表方法
对象.方法(参数)
3.3.1 append,在恰当位置修改原来的列表
3.3.2 count, 统计某个元素在列表中出现的次数
3.3.3 extend,可以在列表的末尾一次性追加另一个序列中的多个值,可以用新列表扩展原有列表
extend方法修改了被扩展的序列,而原始的连接操作返回了一个全新的列表,原来列表不改变
3.3.4 index 用于从列表中找出某个值第一个匹配项的索引位置
3.3.5 insert 用于将对象插入到列表中
3.3.6 pop 移除列表中的一个元素(默认是最后一个),并返回该元素的值
栈,append实现入栈,pop实现出栈
队列,insert(0,...)代替append,或者用pop(0)代替pop----collection模块中的deque对象
3.3.7 remove 用于移除列表中某个值的第一个匹配项,是一个没有返回值的原位置改变方法,修改了列表却没有返回值
3.3.8 reverse 将列表中元素反向存放,改变了列表但不返回值(同remove,sort)
3.3.9 sort 用于在原位置对列表排序,改变原来的位置
获得原序列
3.3.10 高级排序
4.元组:不可变序列
创建,使用逗号分割,自动创建一个元组
>>> 1,2,3 (1,2,3)
元组也是通过圆括号括起来,空元组可以用没有包含内容的两个圆括号表示( )
实现包括一个值的元组,加逗号 >>>42 42 >>>42, (42, ) >>>(42, ) (42, )
>>> 3 * (40+2) 126 >>>3* (40 +2, ) (42, 42, 42)
4.1 tuple函数
以一个序列作为参数并把他转化为元组,如果参数是元组,该参数会被原样返回
>>>tuple([1, 2, 3]) (1, 2, 3) >>>tuple('abc') ('a', 'b', 'c') >>>tuple((1, 2, 3)) (1, 2, 3)
4.2 基本元组操作,创建和访问元组
>>>x = 1, 2 ,3 >>>x[1] 2 >>>x[0:2] (1,2)
元组的分片还是元组,就像列表的分片还是列表
4.3元组存在的意义
元组在映射中当做键使用
元组作为很多内建函数和方法的返回值存在,也就是说必须对元组进行处理,只要是不修改元组,绝大多数情况就是当做列表操作