购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.5 列表

1.4节对比了几种数据序列的特点,包括列表、元组、集合和字典,本节和1.6节将会详细介绍这几种数据序列的使用方法。

相比于元组,列表的元素具有可变性,因此列表既要存储元素数值,还要存储相应的指针,另外也要为可变元素预留存储空间,这导致列表需要有较大内存。而元组虽然不具有可变性,但是却大大节省内存,访问元素的运算速度也远远快于列表。

以下代码的运行结果对比了列表和元组的运算速度和存储空间。读者在试运行以下代码时请耐心地等候计算结果。在作者的电脑上运行时,使用列表需要223秒才结束整个运算,而元组只需要100秒左右就完成了整个运算,因此元组有着很明显的运算优势。

表1-11对比了列表和元组在表示形式上的不同之处。列表的创建需要使用方括号“[]”,而元组的创建需要使用圆括号“()”。列表共有46种内建 方法 (method),而元组有33种。此外,列表中的元素不能被用来创建字典的 (key),而元组中的元素可以被用来创建字典的键。

表1-11 列表和元组对比

表1-12列出了一些列表常用的方法,这包括添加元素方法insert()、append()、extend();删除清空数据方法remove()、clear()、pop(),排序和统计方法sort()和count(),等等。此外,reverse()方法可以将列表中的元素逆向排序。其中remove()、count()和index()方法均需提供要删除/统计/查找序号的数据subdataset。表1-12中的A表示某一列表。

表1-12 列表常用方法

以下代码展示了如何使用insert()、append()和extend()方法。例如,代码中的aList.insert(3,2009)表示在列表aList索引值为3的位置插入数字2009,也就是说在列表的第四个位置插入数字2009。

extend()方法和append()方法均可以将另一个列表中的元素添加到某一列表的末尾,但两者是有区别的。如图1-27所示对比了两者的区别,使用A.extend(B)时,B列表是以数据元素的方式被追加到列表A的末尾,追加后,列表A的维数不变。而使用A.append(B)时,B是以列表的形式追加到列表A的末尾,构成嵌套列表。

图1-27 extend()和append()方法对比

pop()和remove()用于删除列表中的元素。“pop”有匆匆或突然离开的意思,而“remove”是移除的意思。这两个方法最大的不同是,pop()方法需要给定待删除的元素的索引值,而remove()方法则需要给定待删除的元素具体的值。

需要删除某一索引位置处的元素,可以用pop(index)实现,如果未指定索引,即圆括号内为空,则默认删除列表的最后一个元素。此外,使用pop()方法后,被删除的元素的值会被返回。而remove()方法圆括号中需要给定待删除的元素,并且这个方法不返回任何值。另外,还有一种删除列表元素的方式是使用关键字del,del是delete的缩写,del不是一个函数或者方法,使用的方式是“del t[1]”,如以下的代码所示。

列表中常用的统计类方法包括index()和count()等,其中圆括号中是待分析的subdataset。index()方法和count()方法可以分别返回其所在的索引和在列表中出现的次数。另外,min()和max()虽然不是列表的方法,但可以用来返回列表中数值的最小值和最大值。具体使用方式见如下代码。

Python提供了多种方法创建列表,其中 列表推导式 (list comprehension)是一种简捷的列表生成方式。如图1-28所示,列表推导式中for循环和if条件语句的搭配使用使得列表的创建非常简捷。另外,列表推导式中是没有逗号的。

图1-28 列表推导式创建列表

以下代码展示了几个使用列表推导式的例子。

此外,用户在创建列表时,往往有着特定的列表元素生成规则。这些规则常常通过函数实现。Python提供了 匿名函数 (anonymous function)用于列表元素的生成,正如匿名函数的名字所示,在创建和使用匿名函数时,不需要定义和提供函数的名字而是通过关键字lambda实现。用户使用关键字lambda生成数列后,还需要进一步使用映射函数map()或者过滤函数filter()来最终得到列表的元素。如图1-29所示,使用匿名函数创建列表等效于使用def()函数创建列表,且更为简捷。

图1-29 采用匿名函数lambda()和显式函数map()创建列表

以下例子对比了使用匿名函数和显式函数创建列表的不同,显然使用匿名函数的代码更加简洁。

代码的运行结果如下所示。

[59.0, 68.0, 77.0, 86.0]
[59.0, 68.0, 77.0, 86.0]

前面例子展示的是使用匿名函数lambda()和显式函数map()组合的匿名函数来创建列表。此外,lambda()函数和filter()函数常常搭配使用,过滤并保留列表中只符合特定规则的元素。这种结构包含两种形式, 完整形式 (full form)和 简化形式 (simplified form),如图1-30所示。若数据序列对象array中的某一数据能使得过滤函数filter_expression()为true时,这个数据得以保留,成为待创建列表的元素,反之,这个数据则会被过滤掉。简化形式可以实现同样的功能。读者可以根据各人喜好选择。

图1-30 采用匿名函数lambda()和显式函数filter()创建列表

以下代码对比了使用lambda()和filter()过滤函数搭配匿名函数和显式过滤函数在生成列表时的不同。显然,匿名过滤函数定义列表元素的方式更加简洁。

此外,列表推导式还可以使用双for循环列表推导式来生成元素。在双for循环中的两个循环变量均出现在表达式expression中,如图1-31所示。

图1-31 采用双for循环的列表推导式

以下代码展示了一个使用双for循环列表推导式的例子。

矩阵运算是数值运算中非常重要的一部分。 矩阵 (matrix)又称作多维 数组 (array),Python提供了一种基本的采用列表生成矩阵的方法,这种方法是通过列表的多层嵌套来实现。然而,这种嵌套列表常常只是用于表示多维数组,在实际应用过程中,很难进行常用的矩阵运算,如矩阵乘法(如图1-32所示)。对于矩阵和多维数组的运算,推荐使用Python的第三方库NumPy来实现,本书后面章节会对Numpy矩阵作详细讲述。

图1-32 矩阵乘法 oKFgKkHEKiaIbAyWLdidxto1I2f6N0NImvDvJ9b8GqzyhcQuCTtdCGtvmfOV5UCT

点击中间区域
呼出菜单
上一章
目录
下一章
×