python 序列和列表
2015-12-01 by dongnan
数据结构
数据结构是通过某种方式组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其它数据结构。
在python 中最基本的数据结构是序列,序列中的每个元素被分配一个序号,即元素的位置,也称谓索引。
python 有6种内建的序列: 最常用的两种类型列表
和元组
,其它的分别为,字符串,unicode
字符串,buffer
对象和 xrange
对象。
第一个列表
列表的各个元素通过逗号
分割,写在方括号中,另外列表也可以包含其它的序列。
>>> meta = ['dongnan',30, 'male', ['2015', '2016']]
>>> type(meta)
<type 'list'>
而列表与元组的主要区别,列表可以修改,元组则不能。
# list
>>> l1 = [1,2,3]
>>> l1[0] = 5
>>> l1
[5, 2, 3]
# tuple
>>> t1 = (1,2,3)
>>> t1[0] = 5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
序列
序列基本操作
这些操作包括:索引,分片,加,乘,检查成员资格,除此之外python还有计算序列长度,找出最大和最小元素的内建函数。
使用加号可以进行序列的连接操作
>>> [1,2,3] + [4,5,6]
[1, 2, 3, 4, 5, 6]
>>> "hello, " + "world!"
'hello, world!'
错误信息说明,只有两种相同类型的序列才能进行连接操作。
>>> [1,2,3] + 'world!'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "str") to list
乘法
>>> 'python' * 3
'pythonpythonpython'
>>> [42] * 5
[42, 42, 42, 42, 42]
成员资格
检查某个值是否在序列中,可以使用in
运算符,条件为真返回True
,条件为假返回False
这样的运算符叫做布尔运算符,其值叫做布尔值。
>>> users = ['dongnan','ywwd','zongming']
>>> raw_input('Enter your user name: ') in users
Enter your user name: dongnan
True
长度、最小值和最大值
- len 函数返回序列中所有包含元素的数量。
- min 函数返回序列中最小的元素。
- max 函数返回序列中最大的元素。
内建函数,len/min/max 非常有用;
>>> numbers = [100,34,678]
>>> len(numbers)
3
>>> max(numbers)
678
>>> min(numbers)
34
索引
序列中的所有元素都是有编号的,从0
开始递增。
>>> greeting = 'hello'
>>> greeting[0]
'h'
通过索引获取元素,所有序列都可以通过这种方式进行索引,使用负数索引时,python会从右边也就是从最后第一个元素开始计数。
>>> greeting[-1]
'o'
分片
使用分片操作来访问一定范围内的元素,分片通过冒号相隔的两个索引来实现。
>>> tag = '<a href="http://ywwd.net"> dongnan web site</a>'
>>> tag[9:24]
'http://ywwd.net'
>>> tag[27:-4]
'dongnan web site'
分片的编号非常重要,第1个索引是需要提取部分的第1个元素编号,而最后的索引则是分片之后剩下部分的第1个元素编号。
分片取值的实现需要提供两个索引作为边界,第1个值索引的元素是包含在分片内的,第2个值个则不包含在分片内。
>>> numbers = [1,2,3,4,5,6,7,8,9,10]
>>> numbers[3:6]
[4, 5, 6]
>>> numbers[0:1]
[1]
访问最后三个元素
>>> numbers[7:10] # 索引10指向的是第11个元素,这个元素并不存在。
[8, 9, 10]
实际上,只要分片中最左边的索引比它右边的晚出现在序列中,结果就是空的序列。
>>> numbers[-3:0]
[] #空的
如果分片包括序列结尾的元素,只需空置最后一个索引即可。
>>> numbers[-3:]
[8, 9, 10]
同样的方法适用与序列开始元素。
>>> numbers[:3]
[1, 2, 3]
如果复制整个序列,可以将两个索引空置。
>>> numbers[:] #全部
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
步长
默认步长是1,分片操作就是按照这个步长逐个遍历序列的元素。
>>> 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]
步长也可以是负数,即从右到左提取元素。
>>> numbers[::-1]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]