人工智能技术之列表与元组

举报
tea_year 发表于 2023/12/20 22:44:47 2023/12/20
【摘要】 本章学习目标• 掌握列表的概念• 掌握列表的常用操作• 掌握列表解析• 掌握元组的概念• 掌握元组的操作上一章讲解的字符串是简单序列,即字符串中每个元素都是字符。除此之外,列表与元组也是序列,它们的元素可以是不同类型的数据,这使得程序处理大量数据变得更加容易了。5.%2 列表的概念列表是Python以及其他语言中最常用到的数据结构之一。Python中使用中括号[]来表示列表,具体示例如下:s...


本章学习目标

• 掌握列表的概念

• 掌握列表的常用操作

• 掌握列表解析

• 掌握元组的概念

• 掌握元组的操作

上一章讲解的字符串是简单序列,即字符串中每个元素都是字符。除此之外,列表与元组也是序列,它们的元素可以是不同类型的数据,这使得程序处理大量数据变得更加容易了。

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之间所有的水仙花数。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。