
2.4 序列的数据结构
数据结构是计算机存储、组织数据的方式。序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字,即它的位置或索引,第一个索引是0,第二个索引是1,依此类推。序列都可以进行的操作包括索引、截取(切片)、加、乘、成员检查。此外,Python已经内置确定序列的长度以及确定最大和最小元素的方法。Python内置序列类型最常见的是列表、元组和字符串。另外,Python提供了字典和集合这样的数据结构,它们属于无顺序的数据集合体,不能通过位置索引来访问数据元素。
2.4.1 列表
列表(List)是最常用的Python数据类型,列表的数据项不需要具有相同的类型。列表类似于其他语言的数组,但功能比数组强大得多。
创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。例如:

列表索引从0开始。列表可以进行截取(切片)、组合等。
1.访问列表中的值

列表
使用下标索引来访问列表中的值,同样也可以使用方括号切片的形式截取。例如:

程序运行结果:

2.更新列表
可以对列表的数据项进行修改或更新。例如:

程序运行结果:

3.删除列表元素
方法一:使用del语句删除列表中的元素。例如:

程序运行结果:

方法二:使用remove()方法删除列表中的元素。例如:

程序运行结果:

方法三:使用pop()方法删除列表中指定位置的元素,无参数时删除最后一个元素。例如:

程序运行结果:

4.添加列表元素
可以使用append()方法在列表末尾添加元素。例如:

程序运行结果:

5.定义多维列表
可以将多维列表视为列表的嵌套,即多维列表的元素值也是一个列表,只是维度比父列表小1。二维列表(即其他语言的二维数组)的元素值是一维列表,三维列表的元素值是二维列表。例如:定义1个二维列表。

二维列表比一维列表多一个索引,可按如下方法获取元素:

例如:定义3行6列的二维列表,打印出元素值。

程序运行结果:

列表生成式是Python内置的一种极其强大的生成列表的表达式,详见3.2.5节。本例中第3行生成的列表如下:

6.列表的操作符
列表对“+”和“*”的操作符与字符串相似。“+”号用于组合列表,“*”号用于重复列表。Python列表的操作符应用示例如表2-12所示。
表2-12 Python列表的操作符应用示例

Python列表内置函数如表2-13所示。假设列表名为list。
表2-13 Python列表的内置函数

续表

2.4.2 元组
Python的元组(Tuple)与列表类似,不同之处在于元组的元素不能修改。元组使用小括号(),列表使用方括号[]。元组中的元素类型也可以不相同。
1.创建元组

元组
创建元组很简单,只需要在括号中添加元素,并使用逗号隔开即可。例如:

如果创建空元组,只需写个空括号即可。

元组中只包含一个元素时,需要在第一个元素后面添加逗号。

元组与字符串类似,下标索引从0开始,可以进行截取、组合等。
2.访问元组
可以使用下标索引来访问元组中的值。例如:

程序运行结果:

3.元组连接
元组中的元素值是不允许修改的,但可以对元组进行连接组合。例如:

程序运行结果:

4.删除元组
元组中的元素值是不允许删除的,但可以使用del语句删除整个元组。例如:

以上实例元组被删除后,输出变量会有异常信息。输出结果如下:

5.元组运算符
与字符串一样,元组之间可以使用“+”号和“*”号进行运算。这就意味着它们可以组合和复制,运算后会生成一个新的元组。Python元组的操作符应用示例如表2-14所示。
表2-14 Python元组的操作符应用示例

Python元组包含了如表2-15所示的内置函数。
表2-15 Python元组的内置函数

例如:

注意:可以使用元组来一次性对多个变量赋值。例如:

如果想实现x、y的交换,可以编写程序如下:

6.元组与列表转换
因为元组数不变,所以可以将元组转换为列表,从而可以改变数据。实际上列表、元组和字符串之间可以互相转换,需要使用3个函数:str()、tuple()和list()。
可以使用下面的方法将元组转换为列表:

例如:

可以使用下面的方法将列表转换为元组:

例如:

将列表转换成字符串如下:

2.4.3 字典
Python字典(Dict)是一种可变容器模型,且可存储任意类型的对象,如字符串、数字、元组等其他容器模型。字典也被称作关联数组或哈希表。
1.创建字典

字典和集合
字典由键和对应值(key=>value)成对组成。字典的每个键/值对里面键和值用冒号分隔,键/值对之间用逗号分隔,整个字典包括在花括号中。基本语法如下:

注意:键必须是唯一的,但值则不必。值可以取任何数据类型,但键必须是不可变的,如字符串、数字或元组。
一个简单的字典实例:

也可如此创建字典:

字典有如下特性:
(1)字典值可以是任何Python对象,如字符串、数字、元组等。
(2)不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会覆盖前面的值。例如:

实例输出结果:

(3)键必须不可变,所以可以用数字、字符串或元组充当。用列表就不行,例如:

程序运行后输出错误结果:

2.访问字典里的值
访问字典里的值时把相应的键放入方括号里。例如:

程序运行结果:

如果用字典里没有的键访问数据,会输出错误信息:

由于没有sex键,以上实例输出错误结果:

3.修改字典
向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对。例如:

程序运行结果:

4.删除字典元素
del()方法允许使用键从字典中删除元素(条目);clear()方法清空字典所有元素。
显示删除一个字典用del命令,例如:

5.in运算
字典里的in运算用于判断某键是否在字典里,对于value值不适用。功能与has_key(key)方法相似。例如:

程序运行结果:

6.获取字典中的所有值
dict.values()以列表返回字典中的所有值。例如:

程序运行结果:

7.items()方法
items()方法把字典中每对key和value组成一个元组,并把这些元组放在列表中返回。

程序运行结果:

注意:字典打印出来的顺序与创建之初的顺序不同,这不是错误。字典中各个元素并没有顺序之分(因为不需要通过位置查找元素),因此,存储元素时进行了优化,使字典的存储和查询效率最高。这也是字典和列表的另一个区别:列表保持元素的相对关系,即序列关系;而字典是完全无序的,也称为非序列。如果想保持一个集合中元素的顺序,需要使用列表,而不是字典。
字典内置函数和方法如表2-16所示。假设字典名为dict1。
表2-16 字典内置函数和方法

续表

2.4.4 集合
集合(Set)是一个无序不重复元素的序列。集合的基本功能是进行成员关系测试和删除重复元素。
1.创建集合
可以使用大括号({})或者set()函数创建集合。例如:

程序运行结果:

注意:创建一个空集合必须用set()而不是{},因为{}是用来创建一个空字典。
2.成员测试

程序运行结果:

3.集合运算
可以使用“-”“|”“&”运算符进行集合的差集、并集、交集运算。


