
1.5 列表
列表是可修改的序列,可以存放任何类型的数据,用“[]”表示。列表中的元素用逗号分隔,每个元素按照先后顺序有索引号,索引号的基数为0。在列表创建以后,可以进行索引、切片、增删改查、排序等各种操作。
1.5.1 创建列表
创建列表有多种方法。
1. 使用“[]”创建列表
使用方括号“[]”直接创建列表。下面创建一个没有元素的列表。

创建一个元素为一组数据的列表:

创建一个元素为一组字符串的列表:

列表元素的数据类型可以不同。例如:

列表的元素也可以是列表。例如:

2. 使用list函数创建列表
使用list函数能将任何可迭代的数据转换成列表。可迭代的数据包括字符串、区间、元组、字典、集合等。
当list函数不带参数时将创建一个空的列表,例如:

(1)把字符串转换为列表
当list函数的参数为字符串时,将该字符串转换为元素由字符串中各字符组成的列表。

(2)把区间对象转换为列表
使用range函数创建一个区间对象,该对象在指定的范围内连续取值。range函数可有1个、2个或3个参数。当有3个参数时指定区间的起点、终点和步长,比如从2开始,每隔两个数取一次数,取到10为止。当有2个参数时指定起点和终点,步长取1。当有1个参数时指定终点,起点取0,步长取1。
下面是range函数只有1个参数的情况。

生成的区间对象从0开始,以1为间隔连续取8个值,即0~7。所以,从表面上看,虽然range(0, 8)定义的区间终点为8,但实际上不包括8,这习惯上称为“包头不包尾”。使用方括号和索引号可以获取区间对象的值。例如,下面的代码获取区间第1个值和最后1个值。

下面是range函数有3个参数的情况,在0~9范围内每隔两个数取一次数。

通过索引获取区间前两个数:

可见,相邻两个数之间的间隔为2。
将区间对象作为list函数的参数可以创建列表。例如:

(3)把元组、字典和集合转换为列表
使用list函数也可以把元组、字典和集合等可迭代对象转换为列表。关于元组、字典和集合,将在接下来的各节中陆续介绍,这里先看操作效果。
将元组转换为列表:

将字典转换为列表:

将集合转换为列表:

3. 使用split方法创建列表
对于字符串,使用其split方法可以按指定的分隔符进行分割,分割的结果以列表的形式返回。
下面给定一个字符串,使用split方法,用默认的空格分隔符进行分割,返回一个列表。

4. 深入列表
列表中的每个元素都引用一个对象,每个对象都有自己的内存存储地址、数据类型和值。各元素保存对应对象的地址。
下面创建一个列表,用id函数获取列表中各元素引用的对象的地址。

可见,各元素引用的对象的地址各不相同,它们是不同的对象。
1.5.2 添加列表元素
在列表创建以后,可以使用多种方法向列表中添加元素。
1. 使用append方法
使用列表对象的append方法在列表尾部添加新的元素。该方法的执行速度比较快。下面创建一个列表,然后用append方法添加一个元素。

2. 使用extend方法
与append方法一样,使用extend方法也是在列表尾部添加新的元素。与append方法不同的是,它在列表末尾一次性追加另一个序列的多个值,所以它更适合列表的拼接。

extend方法的参数还可以是字符串、区间、元组、字典和集合等可迭代对象。例如:

3. 使用insert方法
使用列表对象的insert方法,可以在指定位置插入指定元素。该方法有两个参数,其中第1个参数指定插入的位置,指定一个索引号,即在它对应的对象前面插入新的对象,索引号的基数为0;第2个参数指定插入的对象。
下面创建一个有4个元素的列表,使用列表对象的insert方法在第4个元素前面插入新对象5。

4. 使用运算符
使用+(加号)可以将两个列表连接起来,组成一个新的列表。例如:

使用乘法扩展,可以将原有列表重复多次,生成新的列表。下面创建一个有2个元素的列表,将它扩展3倍,生成新的列表b。

1.5.3 索引和切片
在创建列表并向列表中添加元素后,如果希望获取列表中某个或某部分元素并对它们进行后续操作,就要用到索引和切片。索引一般是指访问列表中的某个元素,切片则是指连续访问列表中的部分元素。
使用“[]”进行列表索引操作,方括号中为要索引的元素在列表中的索引号。从左到右索引时,索引号的基数为0;从右到左索引时,索引号的基数为-1。
下面创建一个列表ls。

通过索引获取列表中的第3个元素:

获取列表中倒数第2个元素:

使用index方法可以获取指定元素在列表中首次出现的位置。语法格式为:

其中,value为指定的元素,start和end指定搜索的范围。
下面创建一个列表a。

获取元素2在列表中第一次出现的位置,注意位置索引号的基数为0:

从第3个元素开始到最后一个元素,在这个范围内获取元素2第一次出现的位置:

切片操作从给定的列表中连续获取多个元素。常见的列表切片操作如表1-9所示。切片操作完整的定义是[start:end:step],取值范围的起点、终点和步长之间用冒号分隔。这3个参数都可以省略。注意“包头不包尾”原则。
从左往右切片时,位置索引号的基数为0。当省略start参数时,起点为列表的第1个元素;当省略end参数时,终点为列表的最后一个元素;当省略step参数时,步长为1。
从右往左切片时,位置索引号的基数为-1。各参数的值都为负,数字的大小为从右边往左边数数的大小。比如最后一个元素的索引号为-1,倒数第2个为-2,依此类推。
表1-9 列表的切片操作

1.5.4 删除列表元素
在Python中,可以使用多种方法删除列表元素。
使用列表对象的pop方法可以删除指定位置的元素,如果没有指定位置,则删除列表末尾的元素。
下面创建一个列表,用其pop方法删除最后一个元素。

继续删除列表中的第3个元素。注意,位置索引号的基数为0。

使用del命令删除指定位置的元素。下面删除列表中的第4个元素。

pop方法和del命令都是使用索引删除列表元素的,使用remove方法可以直接删除列表中首次出现的指定元素。下面从列表中直接删除第1次出现的元素3。

如果指定的元素在列表中不存在,则返回出错信息。

1.5.5 列表的排序
使用列表对象的sort方法可以对列表中的元素进行排序。默认从小到大排序,不必设置方法参数。下面创建一个列表,使用sort方法将列表元素从小到大进行排序。

设置sort方法的reverse参数的值为True,对列表中的元素按照从大到小的顺序进行排列。

还可以使用Python的内置函数sorted进行排序。该函数不对原列表进行修改,而是返回一个新的列表。设置该函数的reverse参数的值为True,将列表元素进行降序排列。

1.5.6 操作函数
使用len函数获取列表的长度。例如:

使用列表对象的count方法指定元素在列表中出现的次数。下面创建一个列表,计算元素2在列表中出现的次数。

使用成员运算符in或not in判断列表中是否包含或不包含指定元素,如果是则返回True,否则返回False。下面判断给定列表中是否包含元素1,是否不包含元素4。

在使用print函数对列表数据进行格式化输出时,使用索引获取列表的元素。下面创建一个列表,然后使用print函数进行格式化输出。

1.5.7 二维列表
通过列表嵌套可以创建二维或多维列表。二维列表有两层方括号,即列表的元素也是列表。下面创建一个二维列表。

对二维列表进行索引和切片时,要指定行维和列维两个方向上的索引号或取值范围。注意,基数为0。
下面获取二维列表中第2行第3列元素的值。

对于二维列表的切片,首先要明白a[1]和a[1:2]之间的区别。a[1]获取的是二维列表a中的第2个元素,是一个一维列表。例如:

a[1:2]获取的则是一个二维列表,即:

然后就比较好理解下面的结果了:

以及

请反复比较和理解它们之间的差别。