数据结构是通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合。这些数据元素可以是数字或者字符,甚至可以是其他数据结构。
在python中,最基本的数据结构是序列(sequence)。序列中的每个元素被分配一个序号——即元素的位置,也称为索引。第一个索引是0,第二个是1,以此类推。
1.1序列概览
python包含6种內建的序列,最常用的两种类型是:列表和元组。其他的內建序列类型有字符串、Unicode字符串、buffer对象和xrang对象。
列表和元组主要区别在于,列表可以修改,元组不能修改。如果根据要求来添加元素,那么列表可能会更好用;而出于某些原因,序列不能修改的时候,
使用元组则更为合适。一般来说,在编程中,几乎所有的情况下都可以用列表替代元组(注意一个例外的情况:使用元组作为字典的键,因为键不可修改,所以不能使用列表)。
用序列表示数据库中一个人的信息——第1个元素是姓名,第二个元素是年龄(列表的各个元素通过逗号分隔,写在方括号中)。序列可以包含其他的序列,
所以可以构建一个人员信息的列表,这个列表就是你的数据库。
注:python中还有一种名为容器(contaier)的数据结构。容器基本上是包含其他对象的任意对象。序列(例如列表和元组)和映射(例如字典)是两类主要
的容器。序列中的每个元素都有自已的编号,而映射中的每个元素则有一个名字(也称为键)
1.2通用序列操作
所有序列可以进行特定的操作。这些操作包括:索引(indexing)、分片(slicing)、加(adding)、乘(multiplying)以及检查某个元素是否属于序列的成员
(成员资格)。除此之外,python还有计算序列长度、找出最大元素和最小元素的內建函数。
1.2.1索引
序列中的所有元素都是有编号的——从0开始递增。这些元素可以通过元素分别访问,如下图所示
注:字符串就是一个由字符组成的序列。索引0指向第一个元素,在这个列子中就是字母H。
可以通过索引获取元素。所有序列都可以通过这种方式进行索引。使用负数时,python会从右边,也就是从最后1个元素开始计数。最后1个元素的编号是-1(不是
-0,-0会和第一个元素重合):
如果一个函数调用返回一个序列,那么可以直接对结果进行索引操作。例如,假设你只对用户输入年份的第四个数字感兴趣,那么,可以进行如下操作:
代码清单1-2-1-1是一个示例程序,要求输入年、月(1-12的数字)、日(1-31),然后打印出相应的月份名称等等
代码清单1-2-1-1 索引示例
以下是程序执行的一部分结果:
最后一行是程序的输出
1.2.2分片
分片操作是用来访问一定范围内的元素。分片通过冒号隔开的两个索引来实现:
第1个索引是要提取的第一个元素的编号,而最后的索引则是分片之后剩余部分的第一个元素的编号。见如下代码
简而言之就是第一个索引的元素包含在分片内,第二个则不包含在分片内
1.2.2.1优雅的捷径
如果分片包括序列结尾的元素,那么,只需置空最后一个索引即可:
这种方法也适用于序列开始的元素:
如果需要复制整个序列,可以将两个索引都置空
代码清单1-2-2-1是一个小程序,它会提示输入URL(假设它的形式为http://www.somedomainname.com),然后提取域名。
代码清单1-2-2-1 分片示例
以下是程序运行的示例:
1.2.2.2更大的步长
在普通的分片中,步长是1——分片操作就是按照这个步长逐个遍历序列的元素,然后返回开始和结束点之间的所有元素(显示步长)
如果步长被设置为比1大的数,那么就会跳过某些元素。例如,步长为2的分片包括的是从开始到结束每隔1个的元素。
前面提到的捷径也可以使用。如果需要将每4个元素中的第1个提取出来,那么只要将步长设置为4即可:
步长不能为0(0不会执行),但步长可以是负数,此时分片从右到左提取元素:
当使用一个负数作为步长时,必须让开始点(开始索引)大于结束点。对于正数步长,python会从序列的头部开始向右提取元素,直到最后一个元素;对于负数步长,则是从序列的尾部开始向左提取元素,直到第一个元素。
,