第九节 数据结构:列表
大家好,在我们学习了python的模块以后,我们几乎可以编写完整的Python应用程序,甚至面对一些相对复杂的应用需求,我们还能通过包和模块来搭建一个漂亮的系统架构。
但是,假如我们遇到的所谓的复杂的应用需求,并不只是业务逻辑上的复杂,而是数据结构上的复杂呢?所谓数据结构上的复杂,比方说,数据量不仅大,而且各种不同的类型和特征,都需要我们区别对待。那么,我们对数据的理解,仅仅建立在整数、小数、变量之类的概念之上,是远远不够的。事实上,我们编程要解决的问题,往往都不是纯字据类型的,很多非数字型的对象,恰好才是我们真正要处理的对象。而且,它们根据研究对象的特征,我们可以归纳出一些具有相同特性的数据来,我们把它们归集起来,进行相似的处理,效率应该会高很多,这是一个基本的思想。
基于这样的思想,今天开始,我们要进一步学习更为复杂的数据类型,也就是Python所谓四大数据结构。
在开始之前,我们还需要花一点时间,来建立一个非常重要的认知,在实际处理问题的过程中,我们总是会面临大量的数据,甚至于,我们可以理解为,在现实的世界里,解决问题的本身,就是处理数据。离开了数据,任何程序的方法都将是“无米之炊”。
我们很容易发现,几乎,每一门计算机语言都在强调万物皆对象,但是,解决问题,最终还是要靠数据处理。所以,万物皆对象的背后,实际上意味着万物皆数据。因为,有了数据,就可以通过建立合适的模型来解决相应的问题。所以,如何理解对象和数据,并建立相应的解决问题的方案,才是我们程序员需要具备的核心思维能力。
学术上,它叫做数据结构与算法。
你有没有注意到,前面我们所有列举的应用示例中,我们之所以运用一些表达式和流程控制语句,甚至函数、模块等技术,其实,都是为了处理一些变量,包括通过赋值、运算的操作,最终实现数据处理,返回我们想要的结果。
编程的真相就是:好看的代码流程,都只是手段,处理数据才是目的。
这其中,变量就是最基本的数据,处理数据的方法,就是所谓的算法。算法如精灵,千变万化,依赖于我们的智慧。但数据是真实的客观存在,如何将现实世界的对象,恰当地转化为我们方便处理的数据,就是我们需要修炼的功夫!所以,今天的课程,我们开始重点介绍Python的数据结构。
数据结构(Data Structures)亦如其名,从Python语法的角度,它只是一种结构,我们可以形象地理解它是可以存放数据的盒子,不同的数据结构,代表了不同类型的盒子。准确的说,它们是用来存储一系列相关数据的集合。这个描述里包含有三层含义:
1、关键词“一系列”,表示数据一般不是孤立存在的。
2、关键词“相关”,表示能够存储在一起的数据,具有相关性。
3、关键词“集合”,借用了数学的概念,表示数据存在的方式具有可操作性,比如添加、修改、删除、查询、排序、合并 ... 等等。
下面我们来看看Python都有些什么样的数据结构?
除了无处不在的常量和变量作为最基本的数据类型以外,Python 中还有四种内置的数据结构。它将成为我们实现对象数据化和进行数据处理的利器,最大限度地熟练使用它们,你才能真正悟出其中的妙处!
限于篇幅,我们将分四节课来分别介绍这四大数据结构。今天,重点讲列表(list)
1、列表(list)
Python的列表(list),是一种灵活的有序对象的集合。我们前面讲过字符串是一种序列,列表显然也是一种序列。但是,列表和字符串不同。
1、列表可以包含任何种类的对象,甚至可以嵌套,一个列表中可以包含另一个列表作为其中一个对象。
2、列表包含的都是可变对象,支持实时修改(原处修改)。
3、列表可以根据需要增加,或减少。
4、借助列表,我们几乎可以通过脚本创造和处理任意复杂的数据信息。
所以,列表极其重要,应用极为普遍。
2、创建一个列表
将用逗号分隔的对象置于一对方括号之中,就创建了一个列表。
说明:当一个列表赋值给一个变量名,那么,我们就将这个变量作为列表的名称。(本质上是在列表对象和变量名之间创建了一个引用),请注意如何定义一个空的列表和只有一个单项的列表。
3、访问列表中的值
既然列表是一个序列,那么,序列类型的数据都有索引和索引对应的值。因此,我们可以使用下标索引来访问列表中的值。
如下示例:list_1.py。
请注意,上例中,我们用到了所谓切片操作的概念。这里,补充讲解一下:
(1)切片操作是专门针对序列类型数据所进行的一种分段操作行为。
(2)切片是一个序列数据的其中一段。
(3)切片的方法,以list数据为例:list[a:b:c],它会得到一个切片,这个切片是从list数据的a索引位置开始,为0时可省略;到b前面结束,如果直接到末尾,可省略;c为切片方向,默认正向,可省略。
(4)完整的理解切片,我们还需要知道有一种不常用的索引存在,那就是反向索引,它默认从序列的结尾处开始为-1。
4、更新列表
我们可以使用重新赋值、append()方法、del语句对列表的数据项进行修改或更新。
1、通过索引,直接为指定下标的项重新赋值。
2、使用append()方法向列表的末尾追加新的项。
3、使用del语句,通过索引删除指定下标的项。
5、列表的操作符
列表对 + 和 * 的操作符与字符串相似。
+ 号用于组合列表
* 号用于重复列表
PS:尽管几乎所有的序列(包括字符串)都支持 + 号的合并操作,但是,加号 + 两边必须是两个相同类型的序列。不可以把一个列表和一个字符串加在一起!
6、列表操作的函数
(1)、len(list):返回列表元素的个数。
(2)、max(list):返回列表元素最大值。
(3)、min(list):返回列表元素最小值
(4)、list(seq):将元组转换为列表,下一节马上介绍元组。
(5)、range(start, stop[, step]):创建一个整数列表,一般用在 for 循环中。
7、列表操作的方法
(1)、list.append(obj):在列表末尾添加新的对象。
(2)、list.count(obj):统计某个元素在列表中出现的次数。
(3)、list.index(obj):从列表中找出某个值第一个匹配项的索引位置。
(4)、list.insert(index, obj):将对象插入列表(指定索引位置的前面)。
(5)、list.pop(obj=list[-1]):移除列表中的一个元素(默认最后一个元素),并返回该元素的值。
(6)、list.remove(obj):移除列表中某个值的第一个匹配项。
(7)、list.reverse():对原列表进行反向排列。
(8)、list.sort([func]):对原列表进行排序。
(9)、list.extend(seq):在列表末尾追加另一个序列中的值。
8、列表的合并与追加
1、list列表的合并运算使用“+”号,它将生成一个新的列表。
2、append(obj):在列表末尾添加新对象,用新的对象来扩展原来的列表。
3、extend(seq):在列表末尾追加另一个序列中的值,用新列表扩展原来的列表。
4、请注意下面最后一个示例的情形,字符串作为一个序列而不是一个整体被追加进来。
小结
这一节,我们开始深入接触和了解Python的数据结构,并重点介绍了列表及其创建和使用的方法。
预告
下节课,我们继续介绍Python数据结构:元组,它也是Python中最常用的数据结构之一。显然,它和列表有相似和不同之处,在数据处理上,它有一种完全不同的操作魅力。