数据结构是通过某种方式(如对元素进行编号)组织在一起的数据元素的集合,这些元素可以是数字或字符。在Python中,最基本的数据结构是序列(Sequence)。Python包含6种内建序列,即列表、元组、字符串、Unicode字符串、buffer对象和xrange对象。这里只说到最常用的两种,即列表和元组。
1. 通用操作
Python中所有序列都可以进行一些特定操作,包括索引(indexing)、切片(slicing)、序列相加(adding)、乘法(multiplying)、成员资格、长度、最小值和最大值。
索引和切片
在列表后面用 [] 加上数字就可以进行索引了。在索引里面用冒号 : 就可以切片了。
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> a[1] #这就是索引,用下标指向列表里面的元素。
2
>>> a[0] #注意索引从0开始.
1
>>> a[1:3] #Python的切片功能非常强大,只用一个冒号就可以完成各种切片.
[2, 3]
>>> a[:] #如果冒号前后没有数字,分别默认为第一个元素和最后一个元素
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> a[:-1] #索引还可以是负号, 其中-1代表最后一个元素.
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[0:-1] #注意 a[0:-1]和a[:-1]是一样的, 但是a[0:-1] 和a[0:] 不一样,请思考是为什么
[1, 2, 3, 4, 5, 6, 7, 8, 9]
切片操作的实现需要提供两个索引作为边界,第一个索引的元素包含在切片内,第二个索引的元素不包含在分片内。类似于数学里的a≤x<b,x是我们需要得到的元素,a是分片操作中的第一个索引,b是第二个索引,b不包含在x的范围内。
另外,切片里面还有一个默认参数,就是步长。默认情况下,步长为1,需要的时候,可以自定义。
>>> a[0:11:2] #第二个冒号后面就是步长, 如果不写的话默认是1, 现在我设定步长为2.
[1, 3, 5, 7, 9]
>>> a[11:3:-2] #步长也可以设置为负数, 对应的前面的切边也要倒过来,大的序号写在前面, 小的序号写在后面.
[10, 8, 6]
对于正数步长,Python会从序列的头部开始向右提取元素,直到最后一个元素;对于负数步长,则是从序列的尾部开始向左提取元素,直到第一个元素。正数步长必须让开始点小于结束点,而负数步长必须让开始点大于结束点。
序列的加法和乘法就不多说了,和字符串的加法乘法是类似的。
成员资格
Python为我们提供了in运算符,用来检查某个元素是否存在于某个序列。
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> 1 in a
True
>>> 0 in a
False
>>>
注意in是一个运算符,运算符左边是元素,右边是列表,这就构成了一个判断语句,最终语句的结果是True或者False。
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> 1 in a
True
>>> 0 in a
False
>>> 'a' in a
False
>>> b = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
>>> 'a' in b
False
>>> 1 in b #数字可以用in语句检查是否存在字符串列表中。
False
>>> c = '123456789'
>>> 'a' in c
False
>>> 1 in c #但是数字不能用in语句检查是否存在字符串中。
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
1 in c
TypeError: 'in <string>' requires string as left operand, not int
长度、最小值和最大值
Python提供了三个内置函数len(), min(), max(),分别用于计算列表的长度,给出列表的最小值,给出列表的最大值。
用法非常简单,没什么好说的。
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> len(a)
10
>>> min(a)
1
>>> max(a)
10
>>> b = [1, 2,'hello', 10]
>>> len(b)
4
>>> min(b)
Traceback (most recent call last):
File "<pyshell#27>", line 1, in <module>
min(b)
TypeError: '<' not supported between instances of 'str' and 'int'
>>>
然而请注意混合型的列表不能用min() 和max(),否则会出现类型错误。
2. 列表操作
列表的内容是可变的(mutable),这一点和字符串、元组不同。所以列表除了序列的通用操作,如索引、分片、相加、乘法之外,还有一些序列中没有而列表中有的方法。
这些方法的作用都是更新列表,有元素赋值、元素增加、元素删除、分片赋值和列表方法。
元素赋值
列表可以通过索引对元素进行赋值,而不可变的序列比如字符串和元组都不能进行这种操作。
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> a[1]=100
>>> a
[1, 100, 3, 4, 5, 6, 7, 8, 9, 10] #我们改变了索引为1的元素。
>>> b=(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
>>> b[1] = 100
Traceback (most recent call last):
File "<pyshell#32>", line 1, in <module>
b[1] = 100
TypeError: 'tuple' object does not support item assignment #Python不允许对元组的元素赋值。
>>> c = '123456789'
>>> c[1]='100'
Traceback (most recent call last):
File "<pyshell#34>", line 1, in <module>
c[1]='100'
TypeError: 'str' object does not support item assignment #Python不允许对字符串的元素赋值。