2.5.1 列表类型 list

列表(list)是由若干数据组成的序列(sequence)①。构成列表的数据既能作为一个整 体去参加运算,也可以作为个体去参加运算。现实世界中列表是很常见的数据,如名单、待 办事项清单、数学中的数列等都可表示为列表。Python 提供了内建类型 list 以支持列表数 据的表示和操作。

列表的表示

Python 列表类型的字面值采用如下形式:

[<表达式 1>, <表达式 2>, ..., <表达式 n>]

即用一对方括号将以逗号分隔的若干数据(表达式的值)括起来。

列表中成员的个数称为列表的长度,可以用 len()函数求得。 就像数学里有空集一样,不含任何成员的列表也是有意义的,称为空列表,用一对方括号[]表示。空列表的长度当然为 0。 可以将列表字面值赋给变量,以便将来通过变量引用该列表。 下面的语句演示了列表的类型、字面值、长度等基本概念:

>>> type([1,3,5,7,9])
&lt;type 'list'&gt;
>>> len([1,3,5,7,9])
5
>>> ["list","sequence"]
['list', 'sequence']
>>> print [],len([])
[] 0
>>> x = ['apple','banana','orange']
>>> type(x)
<type 'list'>

① 列表和序列几乎是同义词,但本书对两个术语的用法做了区分。序列用作更一般的术语,列表只是序列 的特例。例如,和列表一样,字符串、元组也可视为序列的特例。

>>> print x
['apple', 'banana', 'orange']

很多编程语言都提供一种称为数组(array)的数据类型,数组可以说是列表的特例。 数组的特殊之处有两点:一是固定长度,即成员个数是固定的;二是各成员是同类型的。因 此我们常说程序中定义了一个“长度为 10 的整数数组”或者“长度为 5 的字符串数组”等 等。而 Python 的列表类型没有这两条限制,不但列表长度可以动态改变,而且列表的成员 可以是不同类型的数据。例如,下面这个列表由整数、浮点数、字符串和布尔值四种类型的 数据构成:

>>> y = [123,"apple",3.14,True]
>>> y
[123, 'apple', 3.14, True]

列表的成员本身也可以是列表,如:

>>> z = ["my favorite",["apple","pear"],3.14,[True,False]]
>>> print z
['my favorite', ['apple', 'pear'], 3.14, [True, False]]

计算机应用于数学计算时,经常需要表示数学中的矩阵,显然矩阵可以用以列表为成员 的列表很轻松地表示出来。例如下面的列表 m 就表示了一个 2×3 阶的矩阵:

>>> m = [[11,12,13],[21,22,23]]
>>> print m
[[11, 12, 13], [21, 22, 23]]

列表的操作

为了对列表进行操作,Python 提供了列表成员的索引机制,即通过位置编号来引用列 表成员。列表中第一个成员的索引为 0,第二个成员的索引为 1,其余依此类推。也可以从 后往前编号:最后一个成员的索引是-1,倒数第二个成员的索引是-2,其余依此类推。通 过索引操作访问列表成员的一般形式如下:

<列表>[<数值表达式>] 其中数值表达式的值就是位置索引,整个索引操作的返回结果就是索引位置上的成员。如果 索引超出了范围,则导致出错。

接着前面的例子,我们来通过索引访问列表成员:

>>> x[0]
'apple'
>>> x[-1]
'orange'
>>> i = 0
>>> x[i+1]
'banana'
>>> x[3]
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module> x[3]
IndexError: list index out of range
>>> print y[3],y[1]
True apple
>>> m[0]
[11, 12, 13]
>>> m[0][1]
12

其中最后两个例子显示,我们可以用 m[0]来访问矩阵 m 的第一行,用 m[0][1]来访问矩 阵 m 的第一行、第二列的元素。

Python 也支持通过指定列表的一个索引区间来访问列表的“子列表”,一般形式是:

<列表>[开始位置:结束位置]

其中开始位置和结束位置都是 int 类型的表达式,整个操作的含义是返回从开始位置到结束位置(不含)的子列表。开始位置和结束位置是可选的,在未指定的情况下,Python 默认开始位置为 0,结束位置为 n(列表长度)。仍然延续上面的例子:

>>> x[0:2]
['apple', 'banana']
>>> x[1:]
['banana', 'pear']
>>> x[:-1]
['apple', 'banana']

我们看到,列表的索引机制和前面学过的字符串类型很像。这一点都不奇怪,因为字符 串可以看作是列表的特例——由字符组成的列表。对字符串能执行的操作,对列表也是可以 的。因此,前面学过的字符串运算+和*,也适用于列表,可以实现列表的合并、复制操作。 例如:

>>> [1,3,5] + [2,4]
[1, 3, 5, 2, 4]
>>> 10 * [0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

然而,列表和字符串有一个重大不同:字符串是不可更改的,而列表是可以更改的。我 们可以为列表增加成员、删除成员、改变某个成员的值等等。延续前面的例子演示如下:

>>> x[2] = "pear"
>>> x
['apple', 'banana', 'pear']
>>> x = x + ["peach"]
>>> x
['apple', 'banana', 'pear', 'peach']
>>> del x[1]
>>> x
['apple', 'pear', 'peach']

以上语句首先将列表 x 的第 3 个成员从'orange'改成了'pear',然后为 x 增加了第 4 个 成员'peach',最后将 x 的第 2 个成员'banana'删除。这里 del()是 Python 的内建函数, 用于删除数据。

注意,增加、修改、删除操作除了可以像以上例子一样针对单个列表成员进行,也可以针对列表的一个片段进行。

Python 还支持对列表的许多其他操作,包括搜索列表以查找特定数据、在列表中间插 入数据、给列表排序等等,将在第 6 章中介绍。

range()函数

Python 语言提供了一个内建函数 range(),用于产生整数列表。我们在第 1 章中已经 见到它的用法,这里给出其完整的用法介绍。

range()的一般形式是: range(<起点>, <终点>, <步长>)

返回结果是从起点到终点的有序整数列表,各整数之间以步长为差。要特别注意一点,终点 的含义是说列表中的整数不得超过终点,但它本身是不包含在列表当中的,对此初学者很容 易犯错。另外,起点或步长是可以省略的,它们的缺省值分别是 0 和 1。因此,range 函数 的使用方式有以下三种:

range(n):产生整数列表[0,1,2,...,n-1]
range(i,j):产生整数列表[i,i+1,i+2, ..., j-1]
range(i,j,s):产生整数列表[i,i+s,i+2s,...]

其中第三种形式的返回结果取决于步长 s,不一定以 j-1 作为最后一个成员。

下面看几个例子:

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(5,10)
[5, 6, 7, 8, 9]
>>> range(1,10,2)
[1, 3, 5, 7, 9]
>>> range(10,0,-3)
[10, 7, 4, 1]
>>> range(1,1)
[]

从例中可见,当步长为正数时产生递增的列表,当步长为负数时产生递减的列表。最后一个 例子表明,如果没有满足条件的整数(从 1 开始并且小于 1 的整数是不存在的),则产生空 列表。

range()函数常和 for 循环语句连用,详见第 3 章。