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

4.2 列表结构

列表是Python中非常重要的数据类型,通常作为函数的返回类型。列表和元组相似,也是由一组元素组成,列表可以实现添加、删除和查找操作,元素的值可以被修改。

4.2.1 列表的创建

List(列表)是Python内置的一种数据结构。它由一系列元素组成,所有元素被包含在一对方括号中。列表创建后,可以执行添加或删除操作。使用过Java语言的读者可能想到了Java语言中的List接口,其中ArrayList类继承自List接口,实现了动态数组的功能,可以添加或删除任意类型的对象。Python中列表的作用和ArrayList类相似,用法更灵活。列表创建的格式如下所示。


list = [元素1, 元素2, …]

列表的添加可以调用append(),该方法的声明如下所示。


append(object)

其中,object可以是元组、列表、字典或任何对象。

列表的删除可以调用remove(),该方法的声明如下所示。


remove(value)

该方法将删除元素value。如果value不在列表中,Python将抛出ValueError异常。下面【例4-4】这段代码演示了列表的创建、添加和删除。

【例4-4.py】


01     list = ["apple", "banana", "grape", "orange"]      # 定义列表
02     print (list)                              # 输出列表中所有元素
03     print (list[2])                         # 切片,输出第3个元素
04     list.append("watermelon")               # 在列表末尾添加元素
05     list.insert(1, "grapefruit")          # 向列表中插入元素
06     print (list)
07     list.remove("grape")                     # 从列表中移除grape
08     print (list)
09     list.remove("a")                          # 从列表中移除a,因为当前列表中并没有a,所以将抛出错误
10     print (list.pop())                        # 打印从列表中弹出的元素,即最后一个元素
11     print (list)

【代码说明】

·第1行代码创建了一个list列表,该列表由4个元素的组成。

·第2行代码输出list列表中的内容:


['apple', 'banana', 'grape', 'orange']

·第3行代码输出list列表中的第3个元素grape。

·第4行代码调用list的append(),append()追加了一个“watermelon”元素到列表的末尾。

·第5行代码调用insert(),insert()将元素插入指定的索引位置。这里将“grapefruit”插入list的第2个位置。此时的list列表如下:


['apple', 'grapefruit', 'banana', 'grape', 'orange', 'watermelon']

·第7行代码调用了remove(),移除“grape”元素,移除后的list列表如下:


['apple', 'grapefruit', 'banana', 'orange', 'watermelon']

·第9行代码移除“a”元素,由于列表中不存在此元素,因此程序运行后提示如下错误:


ValueError: list.remove(x): x not in list

·第10行代码调用了pop(),pop()取出列表中最后一个元素,即“弹出”最后一个进入列表的元素“watermelon”。此时的list列表如下:


['apple', 'grapefruit', 'banana', 'orange']

注意 如果list列表中存在两个相同的元素,此时调用remove()移除同名元素,将只删除list列表中靠前的元素。例如,如果list中存在两个“grape”元素,执行语句list.remove("grape")后,其中一个“grape”将被删除,而且此元素是首次出现的那个“grape”元素。

4.2.2 列表的使用

列表的使用与元组十分相似,同样支持负数索引、分片以及多元列表等特性,但是列表中的元素可修改,而且存在一些处理列表的方法。下面【例4-5】的代码说明了负数索引和分片的使用以及二元列表的遍历。

【例4-5.py】


01     list = ["apple", "banana", "grape", "orange"]     # 定义list列表
02     print (list[-2])                                          # 分片,输出倒数第二个元素
03     print (list[1:3])                                         # 分片,输出第2个和第3个元素
04     print (list[-3:-1])                                  # 分片,输出倒数第3个和倒数第2个
05     list = [["apple", "banana"],["grape", "orange"],["watermelon"],["grapefruit"]]
                                                            # 定义list列表
06     for i in range(len(list)):                            # 遍历列表
07         print ("list[%d] :" % i, end=' ')
08         for j in range(len(list[i])):
09             print (list[i][j], end=' ')
10         print()

【代码说明】

·第2行代码输出结果:


grape

·第3行代码输出结果:


['banana', 'grape']

·第4行代码输出结果:


['banana', 'grape']

·第6行到第10行代码遍历二元列表,输出list列表中各元素的值。list列表中,各子列表的长度并不相同,这并不妨碍list列表的遍历。list列表的输出结果如下:


list[0] :  apple  banana
list[1] :  grape  orange
list[2] :  watermelon
list[3] :  grapefruit

列表实现了连接操作的功能,列表的连接同样提供了两种方式,一种是调用extend()连接两个不同的列表,另一种是使用运算符“+”或“+=”。下面【例4-6】这段代码演示了列表的连接功能。

【例4-6.py】


01     list1 = ["apple", "banana"]     # 定义list1列表
02     list2 = ["grape", "orange"]     # 定义list2列表
03     list1.extend(list2)               # list1连接list2
04     print (list1)
05     list3 = ["watermelon"]
06     list1 = list1 + list3             # 将list1与list3连接后赋给list1
07     print (list1)
08     list1 += ["grapefruit"]          # 使用+=给list1连接上["grapefruit"]
09     print (list1)
10     list1 = ["apple", "banana"] * 2
11     print (list1)

【代码说明】

·第3行代码调用extend(),输出结果:


['apple', 'banana', 'grape', 'orange']

·第6行代码使用“+”运算符连接两个列表,输出结果:


['apple', 'banana', 'grape', 'orange', 'watermelon']

·第8行代码使用“+=”运算符,输出结果:


['apple', 'banana', 'grape', 'orange', 'watermelon', 'grapefruit']

·第10行代码使用“*”运算符,连接了两个相同的['apple','banana']元组,输出结果:


['apple', 'banana', 'apple', 'banana']

4.2.3 列表的查找、排序、反转

前面已经提到,list列表可以进行添加、删除操作,此外list列表还提供了查找元素的方法。List列表的查找提供了两种方式,一种是使用index方法返回元素在列表中的位置,另一种方法是使用关键字“in”来判断元素是否在列表中。下面这段代码演示了列表的查找。


01     list = ["apple", "banana", "grape", "orange"]     # 定义list列表
02     print (list.index("grape"))                         # 打印grape的索引
03     print (list.index("orange"))                           # 打印orange的索引
04     print ("orange" in list)                               # 判断orange是否在列表中

【代码说明】

·第2行代码返回元素“grape”对应的索引值,输出值为2。

·同理,第3行代码的输出值为3。

·第4行代码判断元素“orange”是否在list列表中,返回值为True。

列表提供了排序和反转的方法,下面这段代码展示了列表的排序和反转。


01     list = ["banana", "apple", "orange", "grape"]     # 定义list列表
02     list.sort()                                             # 排序
03     print ("Sorted list:", list)
04     list.reverse()                                         # 反转
05     print ("Reversed list:", list)

【代码说明】

·第2行代码调用sort(),元素按照首字母升序排序。排序后的结果:


Sorted list: ['apple', 'banana', 'grape', 'orange']

·第4行代码调用reverse(),反转列表中元素的排列顺序。反转后的结果:


Reversed list: ['orange', 'grape', 'banana', 'apple']

注意 在Python中,列表是由类list实现的。使用函数help(list)查看list类的定义,可以快速了解列表所包含的方法。Help函数同样适用于其他Python类。

表4-1列出了列表的常用方法。

表4-1 列表的常用方法

4.2.4 列表实现堆栈和队列

堆栈和队列是数据结构中常用的数据结构,列表可以用来实现堆栈和队列。

堆栈是指最先进入堆栈的元素最后才输出,符合“后进先出”的顺序。栈的插入、弹出是通过栈首指针控制的。插入一个新的元素,指针移到新元素的位置;弹出一个元素,指针移到下面一个元素的位置,即原堆栈倒数第2个元素的位置,该元素成为栈顶元素。

队列是指最先进入队列的元素最先输出,符合“先进先出”的顺序。队列的插入、弹出是分别通过队首指针和队尾指针控制的。插入一个新的元素,队尾指针移到新元素的位置;弹出一个元素,队首指针移到原队列中第2个元素的位置,该元素成为队列的第1个元素。

使用列表的append()、pop()方法可以模拟这两个数据结构,append()、pop()的使用参见4.2.1小节。

首先分析一下堆栈的实现,调用append()可以把一个元素添加到堆栈的顶部,调用pop()方法把堆栈中最后一个元素弹出来。

假设有一个堆栈["apple","grape","grape"],要向堆栈中添加一个新的元素“orange”。图4-4描述了列表实现堆栈的原理。

图4-4 列表实现堆栈的原理

“apple”是列表中第1个进入的元素,所以置于堆栈的最底端。调用append("orange")后,程序把“orange”元素插到堆栈的顶部。此时栈的指针移动到元素“orange”,栈中包含4个元素,“orange”置于堆栈的顶部。然后调用pop(),弹出顶部的元素“orange”,栈的指针移到“grape”。

下面这段代码使用列表模拟了堆栈。


01     # 堆栈的实现
02     list = ["apple", "grape", "grape"]          # 定义list列表
03     list.append("orange")                        # 将orange压入堆栈
04     print (list)
05     print ("弹出的元素:", list.pop())         # 从堆栈中弹出最后压入的元素
06     print (list)

【代码说明】

·第2行代码创建了一个堆栈list。

·第3行代码向堆栈中添加一个元素“orange”。

·第4行代码输出添加新元素后堆栈中的内容。输出结果:


['apple', 'banana', 'grape', 'orange']

·第5行代码弹出堆栈中最顶部的元素。输出结果:弹出的元素:


orange

·第6行代码输出顶部元素被弹出后堆栈中的内容。输出结果:


['apple', 'banana', 'grape']

队列也是通过调用append()和pop()方法实现的。pop()的调用方式有所不同,通过调用pop(0)弹出队列最前面的元素。假设有一个队列["apple","grape","grape"],要向队列中添加一个新的元素“orange”。图4-5描述了列表实现队列的原理。

图4-5 列表实现队列的原理

“apple”是列表中第1个进入的元素,所以置于队列的最前端。调用append("orange")后,程序把“orange”元素插到队列的尾部,队尾指针移到元素“orange”。此时列表中包含4个元素,“orange”置于队列的尾部。然后调用pop(0),弹出队列最前面的元素“apple”,队首指针移到元素“banana”。从而实现了“先进先出”的队列结构。下面这段代码使用列表模拟了队列。


01     #队列的实现
02     list = ["apple", "grape", "grape"]     # 定义list列表
03     list.append("orange")                    # 队尾加入orange
04     print (list)
05     print ("弹出的元素:", list.pop(0))     # 弹出第一个元素
06     print (list)

【代码说明】

·第2行代码创建了一个队列list。

·第3行代码向队列中添加一个元素“orange”。

·第4行代码输出添加新元素后队列中的内容。输出结果:


['apple', 'banana', 'grape', 'orange']

·第5行代码弹出队列最前面的元素。输出结果:


弹出的元素: apple

·第6行代码输出最前面的元素被弹出后队列中的内容。输出结果:


['banana', 'grape', 'orange']

堆栈和队列是数据结构这门课程探讨的内容,读者可以参考相关的书籍进一步学习。 BHVWv5i91xqMzExJWJ6iswsNwjFFmnPvBjxMS2Zqyvqnz53bDY8/2XYI/EcGvHBY

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