人工智能技术之列表与元组
本章学习目标
• 掌握列表的概念
• 掌握列表的常用操作
• 掌握列表解析
• 掌握元组的概念
• 掌握元组的操作
上一章讲解的字符串是简单序列,即字符串中每个元素都是字符。除此之外,列表与元组也是序列,它们的元素可以是不同类型的数据,这使得程序处理大量数据变得更加容易了。
5.%2 列表的概念
列表是Python以及其他语言中最常用到的数据结构之一。Python中使用中括号[]来表示列表,具体示例如下:
student = [20190101, "小千", 18, 99.5]
5.1.1 列表的创建
列表是一组任意类型的值组合而成,组成列表的值称为元素,每个元素之间用逗号隔开,具体示例如下:
list1 = [1, 2, 3, 4, 5] # 元素为int型
list2 = ['千锋教育', '扣丁学堂', '好程序特训营'] # 元素为String型
list3 = ['小千', 18, 98.5] # 元素为混合类型
list4 = ['千锋教育', ['小千', 18, 98.5]] # 列表嵌套列表
上述示例中,创建了4个列表,其中list4中嵌套一个列表,正是由于列表中元素可以是任意类型数据,才使得数据表示更加简单。
此外,还可以创建一个空列表,具体示例如下:
list5 = []
读者可能会疑惑,创建一个空列表有什么作用,在实际开发中很多情况下,编程者通常无法提前预知列表中包含多少个元素及每个元素的值,只知道将会用一个列表来保存这些元素。当有了空列表后,程序就可以向这个列表中添加元素。此处需注意,列表中的元素是可变的,这意味着可以向列表中添加、修改和删除元素。
列表中的元素还可以是变量,但是修改变量的值,并不会影响列表中元素的值,如例5-1所示。
例5-1
1 name, age, score = '小千', 18, 95.5
2 list1 = [name, age, score]
3 print(list1)
4 name, age, score = '小锋', 20, 100
5 print(list1)
6 print(name, age, score)
运行结果如图5.1所示。
图5.1 运行结果
在例5-1中,第2行根据前面定义的变量创建一个列表,第4行修改变量的值。从程序运行结果可发现,变量修改前后,列表中元素的值没有发生变化。
此外,创建列表还可以通过list()函数,如例5-2所示。
例5-2
1 list1 = list("qianfeng")
2 list2 = list(range(1,5))
3 list3 = list(range(5))
4 list4 = list(range(1, 5, 2))
5 print(list1)
6 print(list2)
7 print(list3)
8 print(list4)
运行结果如图5.2所示。
图5.2 运行结果
在例5-2中,第1行将字符串中每个字符作为列表中的每个元素。第2行到第4行通过range()函数生成的一系列整数作为列表的元素,range()函数的用法如表5.1所示。
表5.1 range()函数
函数 |
说明 |
range(start,end) |
返回一系列整数从start开始,到end-1结束,相邻两个整数差1 |
range(end) |
返回列一系列整数从0开始,到end-1结束,相邻两个整数差1 |
range(start,end,step) |
返回一系列整数从start开始,相邻两个整数差step,结束整数不超过end-1 |
5.1.2 列表的索引与分片
列表的索引与字符串的索引类似,都分为正向与反向索引,如图5.3所示。
图5.3 列表索引
在图5.3中,列表中每一个元素都对应两个下标,例如索引列表中元素5,可以通过以下两种方式:
list1[4]
list1[-4]
列表的分片与字符串的分片也类似,列表的分片可以从列表中取得多个元素并组成一个新列表,接下来演示列表的分片,如例5-3所示。
例5-3
1 list1 = [1, 2, 3, 4, 5, 6, 7, 8]
2 print(list1[2:6])
3 print(list1[2:6:2])
4 print(list1[:6])
5 print(list1[2:])
6 print(list1[-6:-2])
7 print(list1[-6:-2:2])
8 print(list1[::-2])
运行结果如图5.4所示。
图5.4 运行结果
在例5-3中,注意对原列表进行分片操作后返回一个新列表,原列表并没有发生任何变化。
5.1.3 列表的遍历
前两小节讲解了如何创建列表与索引列表中一个元素,那如何遍历列表中所有元素,可以通过前面学习的while循环或for循环实现。
1. 通过while循环遍历列表
通过while循环变量列表,需要使用len()函数,该函数可以获取序列中元素的个数,具体示例如下:
print(len('qianfeng')) # 输出8
list = [1, 2, 3, 4]
print(len(list)) # 输出4
这样就可以将len()函数获取列表的个数作为while循环的条件,如例5-4所示。
例5-4
1 list = ['千锋教育', '扣丁学堂', '好程序员特训营']
2 length ,i = len(list), 0
3 while i < length:
4 print(list[i])
5 i += 1
运行结果如图5.5所示。
图5.5 运行结果
在例5-4中,while循环通过控制变量i来遍历列表中的元素。
2. 通过for循环遍历列表
由于列表是序列的一种,因此通过for循环遍历列表非常简单,只需将列表名放在for语句中in关键词之后即可,如例5-5所示。
例5-5
1 list = ['千锋教育', '扣丁学堂', '好程序员特训营']
2 for value in list:
3 print(value)
运行结果如图5.6所示。
图5.6 运行结果
在例5-5中,for循环依次将列表中的元素赋值给value并通过print()函数输出。
5.%2 列表的运算
列表与字符串类似,也可以进行一些运算,如表5.2所示,
表5.2 列表的运算
运算符 |
说明 |
+ |
列表连接 |
* |
重复列表元素 |
[] |
索引列表中的元素 |
[:] |
对列表进行分片 |
in |
如果列表中包含给定元素,返回True |
not in |
如果列表中包含给定元素,返回False |
接下来演示列表的运算,如例5-6所示。
例5-6
1 list1, list2 = ['千锋教育', '扣丁学堂'], ['好程序员特训营']
2 print(list1 + list2)
3 print(3 * list2)
4 print("扣丁学堂" in list2)
5 print("千锋教育" in list1)
6 name1, name2 = list1[0:]
7 name3, name4 = list1
8 print(name1, name2, name3, name4)
运行结果如图5.7所示。
图5.7 运行结果
在例5-6中,程序通过使用列表的运算,可以很方便地操作列表。
5.%2 列表的常用操作
列表中存储了不同数据类型的元素,当创建完列表后,就需要对这些元素进行操作,例如添加元素、修改元素、删除元素等,本节讲解列表的常用操作。
5.3.1 修改元素
修改列表中的元素是非常简单的,只需索引需要修改的元素并赋新值即可,如例5-7所示。
例5-7
1 list1, list2 = ['千锋教育', '扣丁学堂', '好程序员特训营'], [1, 2, 3]
2 list1[0], list1[1] = 'www.qfedu.com', 'www.codingke.com'
3 print(list1)
4 list1[1:] = list2[0:2]
5 print(list1)
运行结果如图5.8所示。
图5.8 运行结果
在例5-7中,第2行通过分别对list[0]、list[1]赋值来改变列表中元素的值,第4行通过分片对列表中元素进行赋值。
5.3.2 添加元素
在列表中添加元素的方法有多种,如表5.3所示。
表5.3 添加元素函数
函数 |
说明 |
append(obj) |
在列表末尾添加元素obj |
extend(seq) |
在列表末尾一次性添加另一个序列seq中的多个元素 |
insert(index, obj) |
将元素obj插入列表的index位置处 |
在表5.3中,每个函数的作用稍微有点区别。接下来演示其用法,如例5-8所示。
例5-8
1 list1, list2 = [], ['www.qfedu.com', 'www.codingke.com']
2 list1.append('千锋教育')
3 print(list1)
4 list1.extend(list2)
5 print(list1)
6 list1.insert(1, '扣丁学堂')
7 print(list1)
运行结果如图5.9所示。
图5.9 运行结果
在例5-8中,第2行通过append()函数向空列表list1中添加元素'千锋教育'。第4行通过extend()函数向列表list1末尾依次添加list2中的元素。第6行通过insert()函数向列表list1中下标为1处添加元素'扣丁学堂'。
5.3.3 删除元素
在列表中删除元素的方法有多种,如表5.4所示。
表5.4 删除元素函数
函数 |
说明 |
pop(index=-1) |
删除列表中index处的元素(默认index=-1),并且返回该元素的值 |
remove(obj) |
删除列表中第一次出现的obj元素 |
clear() |
删除列表中所有元素 |
接下来演示这三个函数的用法,如例5-9所示。
例5-9
1 list = ['千锋教育', '扣丁学堂', '好程序员特训营', 'qfedu', 'codingke']
2 name = list.pop()
3 print(list, name)
4 name = list.pop(1)
5 print(list, name)
6 list.append('千锋教育')
7 print(list)
8 list.remove('千锋教育')
9 print(list)
10 list.clear()
11 print(list)
运行结果如图5.10所示。
图5.10 运行结果
在例5-9中,第2行通过pop()函数删除列表list中最后一个元素并将删除的元素赋值给name。第4行通过pop()函数删除列表中下标为1处的元素并将删除的元素赋值给name。第6行向列表中添加元素'千锋教育',此时列表中有两个'千锋教育'。第8行删除列表中第一次出现的'千锋教育'这个元素。
5.3.4 查找元素位置
index()函数可以从列表中查找出某个元素第一次出现的位置,其语法格式如下:
index(obj, start = 0, end = -1)
其中,obj表示需要查找的元素,start表示查找范围的起始处,end表示查找范围的结束处(不包括该处)。
接下来演示该函数的用法,如例5-10所示。
例5-10
1 list = ['千锋教育', '扣丁学堂', '好程序员特训营', '扣丁学堂']
2 print(list.index('扣丁学堂'))
3 print(list.index('扣丁学堂', 2))
4 print(list.index('扣丁学堂', 1, 3))
运行结果如图5.11所示。
图5.11 运行结果
在例5-10中,第2行查找整个列表中'扣丁学堂'第一次出现的位置。第3行查找列表下标在[2,-1]范围内'扣丁学堂'第一次出现的位置。第4行查找列表下标在[1,3)范围内'扣丁学堂'第一次出现的位置。
5.3.5 元素排序
有时列表中的元素需要排序,可以使用sort()函数,如例5-11所示。
例5-11
1 list = [5, 9, 4, 7, 1, 8, 2]
2 list.sort()
3 print(list)
4 list.sort(reverse = True)
5 print(list)
运行结果如图5.12所示。
图5.12 运行结果
在例5-11中,第2行使用sort()函数对列表list中的元素进行排序,默认按从小到大进行排序。第4行设置参数reverse = True,则列表中的元素按从大到小进行排序。
此外,对列表操作时,reverse()函数可以将列表中的元素反转,如例5-12所示。
例5-12
1 list = ['千锋教育', '扣丁学堂', '好程序员特训营']
2 list.reverse()
3 print(list)
运行结果如图5.13所示。
图5.13 运行结果
在例5-12中,第2行使用reverse()函数对列表list中的元素进行反转。
5.3.6 统计元素个数
count()函数可以统计列表中某个元素的个数,如例5-13所示。
例5-13
1 list = ['千锋教育', '扣丁学堂', '好程序员特训营', '扣丁学堂']
2 print(list.count('扣丁学堂'))
运行结果如图5.14所示。
图5.14 运行结果
在例5-13中,第2行使用count()函数统计列表list中元素'扣丁学堂'的个数。
5.%2 列表推导
根据前面学习的知识,已有一个包含10个整数的列表list,创建一个新列表newList,该列表中每个元素为list列表中每个元素的平方,如例5-14所示。
例5-14
1 list = range(1, 11)
2 newList = []
3 for num in list:
4 newList.append(num ** 2)
5 print(newList)
运行结果如图5.15所示。
图5.15 运行结果
在例5-14中,通过for循环遍历list中的每一个元素并计算出平方值,然后将平方值添加到列表newList中。
在Python中可以使用更简单的方法实现上述功能,如例5-15所示。
例5-15
1 list = range(1, 11)
2 newList = [num ** 2 for num in list]
3 print(newList)
运行结果如图5.16所示。
图5.16 运行结果
在例5-15中,仅使用一行语句就完成上例中三行语句的功能,其中用到的知识就是列表推导,其语法格式如下:
[表达式1 for k in L if 表达式2 ]
该语句与下面的语句等价,具体如下所示:
List = []
for k in L:
if 表达式2:
List.append(表达式1)
其中,List的元素由每一个“表达式1”组成。if语句用于过滤,可以省略。
接下来演示列表推导中含有if语句,如例5-16所示。
例5-16
1 list = range(1, 11)
2 newList = [num ** 2 for num in list if num > 5]
3 print(newList)
运行结果如图5.17所示。
图5.17 运行结果
在例5-16中,通过if条件语句过滤list列表中大于5的元素值,然后对该该值进行平方并加入到newList列表中。
5.%2 元组
元组与列表类似,也是一种序列,不同之处在于元组中元素不能被改变,并且通常写成圆括号中的一系列元素。
5.5.1 元组的创建
创建元组的语法非常简单,只需用逗号将元素隔开,具体示例如下:
tuple1 = 1, 2, 3, 4
tuple2 = 'xiaoqian', 18, 100
通常是用圆括号将元素括起来,具体示例如下:
tuple3 = (1, 2, 3, 4)
tuple4 = ('xiaoqian', 18, 100)
此外,还可以创建一个空元组,具体示例如下:
tuple5 = ()
接下来创建只包含一个元素的元组,其方法有点特殊,具体示例如下:
tuple6 = (1,)
注意此处逗号必须添加,如果省略,则相当于在一个普通括号内输入了一个值。此处添加逗号后,就通知解释器,这是一个元组,具体示例如下:
tuple6 = (1,)
tuple7 = (1)
如果通过print()函数将tuple6与tuple7分别进行输出,则得到以下结果:
(1,)
1
通过输出结果可得出,第一个为元组,第二个为一个整数。
5.5.2 元组的索引
元组可以使用下标索引来访问元组中的一个元素,也可以使用分片访问多个元素,如例5-17所示。
例5-17
1 tuple = ('千锋教育', '扣丁学堂', '好程序员特训营')
2 print(tuple[0])
3 tuple1 = tuple[0:-1]
4 print(tuple1)
5 tuple2 = tuple[1:]
6 print(tuple2)
运行结果如图5.18所示。
图5.18 运行结果
在例5-17中,第2行通过下标索引访问元组中的元素。第3行与第5行对元组进行分片,元组的分片还是元组,就像列表的分片还是列表一样。
注意不能通过下标索引修改元组中的元素,具体示例如下:
tuple[0] = 'www.qfedu.com' # 错误
上述语句运行时会报错,因为元组中元素不能被修改。
初学者学习元组时,可能会疑惑既然有列表,为什么还需要元组,这是由于如下原因:
• 元组的速度比列表快。如果定义了一系列常量值,而所做的操作仅仅是对它进行遍历,那么一般使用元组而不是列表。
• 元组对需要修改的数据进行写保护,这样将使得代码更加安全。
• 一些元组可用作字典键。
5.5.3 元组的遍历
元组的遍历与列表的遍历类似,都可以通过for循环实现,如例5-18所示。
例5-18
1 tuple = ('千锋教育', '扣丁学堂', '好程序员特训营')
2 for name in tuple:
3 print(name)
运行结果如图5.19所示。
图5.19 运行结果
在例5-18中,for循环依次将列表中的元素赋值给name并通过print()函数输出。
5.5.4 元组的运算
元组的运算与列表的运算类似,如例5-19所示。
例5-19
1 tuple1 = ('千锋教育', '扣丁学堂', '好程序员特训营')
2 tuple2 = ('qfedu', 'codingke')
3 print(tuple1 + tuple2)
4 print(tuple2 * 3)
5 print('千锋教育' in tuple1)
6 print('扣丁学堂' not in tuple2)
运行结果如图5.20所示。
图5.20 运行结果
在例5-19中,元组的运算与列表的运算相似。
5.5.5 元组与列表转换
list()函数可以将元组转换为列表,而tuple()函数可以将列表转换为元组,如例5-20所示。
例5-20
1 tuple1 = ('千锋教育', '扣丁学堂', '好程序员特训营')
2 list1 = list(tuple1)
3 print(list1)
4 tuple2 = tuple(list1)
5 print(tuple2)
运行结果如图5.21所示。
图5.21 运行结果
在例5-20中,第2行通过list()函数将元组tuple1转换为列表list1,第4行通过tuple()函数将列表list1转换为元组tuple2。
5.%2 小案例
5.6.1 案例一
在某比赛中,共有5位评委给选手打分。计算选手得分时,去掉一个最高分与最低分,然后求其平均值,该值就是选手的得分,具体实现如例5-21所示。
例5-21
1 score = []
2 for i in range(1,6):
3 num = float(input('%d号评委打分:'%i))
4 score.append(num)
5 min = min(score) # 获取最低分
6 max = max(score) # 获取最高分
7 score.remove(min) # 去除最低分
8 score.remove(max) # 去除最高分
9 ave = sum(score) / len(score) # 求平均值
10 print('选手最终得分为%.2f'%ave)
运行结果如图5.22所示。
图5.22 运行结果
在例5-21中,首先定义一个空列表,然后通过for循环依次往列表score中添加元素,直到5位评委得分都输入结束循环,接着从列表score中移除最大值与最小值,最后通过sum()函数求和并除以元素个数得到平均分。
5.6.2 案例二
在Python中,矩阵可以用列表来表示,具体示例如下:
matrix = [
[1, 3, 5],
[2, 6, 8],
[7, 9, 4]
]
示例中代表的矩阵如下所示:
现要求通过代码将该矩阵进行转置,即变为如下形式:
具体实现过程,如例5-22所示。
例5-22
1 matrix = [
2 [1, 3, 5],
3 [2, 6, 8],
4 [7, 9, 4]
5 ]
6 print(matrix)
7 # 方法一
8 newMatrix = []
9 for i in range(len(matrix[0])):
10 newRow = []
11 for oldRow in matrix:
12 newRow.append(oldRow[i])
13 newMatrix.append(newRow)
14 print(newMatrix)
15 # 方法二
16 newMatrix = []
17 for i in range(len(matrix[0])):
18 newMatrix.append([row[i] for row in matrix])
19 print(newMatrix)
20 # 方法三
21 newMatrix = [[row[i] for row in matrix] for i in range(len(matrix[0]))]
22 print(newMatrix)
运行结果如图5.23所示。
图5.23 运行结果
在例5-22中,矩阵的表示方法可以看成是列表嵌套列表。第一种方法通过两层for循环完成矩阵的转置,每次从列表matrix的所有子列表中取一个元素作为另一个列表newMatrix的子列表。第二种方法与第三种方法使用了列表推导,本质还是for循环。
5.%2 本章小结
本章主要介绍了Python中的列表与元组,两者都是序列。列表使用方括号表示,其中的元素可以被修改,而元组使用圆括号表示,其中的元素不能被修改。在实际编程中,读者应根据这两种序列的特点选择合适的类型。
5.%2 习题
1.填空题
(1) 列表使用 括号表示。
(2) 元组使用 括号表示。
(3) 函数可以删除列表中最后一个元素。
(4) 函数可以对列表中的元素进行排序。
(5) 函数可以将列表转换为元组。
2.选择题
(1) 下列属于列表的是( )。
A.1, 2, 3, 4 B.[1, 2, 3, 4]
C.{1, 2, 3, 4} D.(1, 2, 3, 4)
(2) 若list = [2, 3, 1, 4],在经过list.reverse()操作后,list为( )。
A.(4, 1, 3, 2) B.(3, 2, 4, 1)
C.[4, 1, 3, 2] D.[3, 2, 4, 1]
(3) 下列不属于元组的是( )。
A.'a', 'b', 'c' B.1, 2, 3
C.['a', 'b', 'c'] D.(1, 2, 3)
(4) 若tuple = (2, 3, 1, 4),则list(tuple)返回( )。
A.[2, 3, 1, 4] B.(2, 3, 1, 4)
C.2, 3, 1, 4 D.None
(5) 若a = (2),则print(a)输出( )。
A.(2, 0) B.(2, )
C.None D.2
3.思考题
(1) 简述列表与元组的区别。
(2) 若a = [1],则a.append(['a', 'b'])与a.extend(['a', 'b'])实现的效果一样吗?
4.编程题
水仙花数是指一个n位数(n≥3),它的每个位上的数字的n次幂之和等于它本身。例如:13+53+33=153。求100~999之间所有的水仙花数。
- 点赞
- 收藏
- 关注作者
评论(0)