



|
4.2 列表结构 |
列表是Python中非常重要的数据类型,通常作为函数的返回类型。列表和元组相似,也是由一组元素组成,列表可以实现添加、删除和查找操作,元素的值可以被修改。
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-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']
前面已经提到,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 列表的常用方法
堆栈和队列是数据结构中常用的数据结构,列表可以用来实现堆栈和队列。
堆栈是指最先进入堆栈的元素最后才输出,符合“后进先出”的顺序。栈的插入、弹出是通过栈首指针控制的。插入一个新的元素,指针移到新元素的位置;弹出一个元素,指针移到下面一个元素的位置,即原堆栈倒数第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']
堆栈和队列是数据结构这门课程探讨的内容,读者可以参考相关的书籍进一步学习。