第五章 列表

1. 列表的创建和删除

Python中的列表和歌曲列表类似,也是由一系列按特定顺序排列的元素组成的。它是Python中内置的 可变序列。在形式上,列表的所有元素都放在一对中括号“[]”中,两个相邻元素间使用逗号“,”分隔。在内容上,可以将整数、实数、字符串、列表、元组等任何类型的内容放入到列表中,并且同一个列表中,元素的类型可以不同,因为它们之间没有任何关系。

1.1 使用赋值运算符直接创建列表

同其他类型的Python变量一样,创建列表时,也可以使用赋值运算符“=”直接将一个列表赋值给变量,语法格式如下:

listname = [element 1,element 2,element 3,,element n]

其中,listname表示列表的名称,可以是任何符合Python命名规则的标识符;“element 1,element 2, element 3,…,element n”表示列表中的元素,个数没有限制,并且只要是Python支持的数据类型就可以。

例如,下面定义的列表都是合法的:

num = [7,14,21,28,35,42,49,56,63]

verse = ["自古逢秋悲寂寥","我言秋日胜春朝","晴空一鹤排云上","便引诗情到碧霄"]

untitle = ['Python',28,"人生苦短,我用Python",["爬虫","自动化运维","云计算","Web开发"]]

python = ['优雅',"明确",'''简单''']

说明:在使用列表时,虽然可以将不同类型的数据放入到同一个列表中,但是通常情况下,我们不这样做,而是在一个列表中只放入一种类型的数据。这样可以提高程序的可读性。

1.2 创建空列表

在Python中,也可以创建空列表,例如,要创建一个名称为emptylist的空列表,可以使用下面的代码:

emptylist = []

1.3 创建数值列表

在Python中,数值列表很常用。例如,在考试系统中记录学生的成绩,或者在游戏中记录每个角色的位置、各个玩家的得分情况等都可应用数值列表。在Python中,可以使用list()函数直接将range()函数循环出来的结果转换为列表。

list()函数的基本语法如下:

list(data)

其中,data表示可以转换为列表的数据,其类型可以是range对象、字符串、元组或者其他可迭代类型的数据

例如,创建一个10~20之间(不包括20)所有偶数的列表,可以使用下面的代码:

list(range(10, 20, 2))

运行上面的代码后,将得到下面的列表:

[10, 12, 14, 16, 18]

说明:使用 list() 函数不仅能通过range对象创建列表,还可以通过其他对象创建列表。

1.4 删除列表

对于已经创建的列表,不再使用时,可以使用del语句将其删除。语法格式如下:

del listname

其中,listname为要删除列表的名称。

说明:del语句在实际开发时,并不常用。因为Python自带的垃圾回收机制会自动销毁不用的列表,所以即使我们不手动将其删除,Python也会自动将其回收。

例如,定义一个名称为team的列表,然后再应用del语句将其删除,可以使用下面的代码:

team = ["皇马","罗马","利物浦","拜仁"]

del team

常见错误:在删除列表前,一定要保证输入的列表名称是已经存在的,否则将出现错误。

2. 访问列表元素

在Python中,如果想将列表的内容输出也比较简单,可以直接使用print()函数即可。例如,创建一个名称为untitle的列表,并打印该列表,可以使用下面的代码:

untitle = ['Python',28,"人生苦短,我用Python",["爬虫","自动化运维","云计算","Web开发"]]

print(untitle)

执行结果如下:

['Python', 28, '人生苦短,我用Python', ['爬虫', '自动化运维', '云计算', 'Web开发']]

从上面的执行结果中可以看出,在输出列表时,是包括左右两侧的中括号的。如果不想要输出全部的元素,也可以通过列表的索引获取指定的元素。例如,要获取untitle列表中索引为2的元素,可以使用下面的代码:

print(untitle[2])

执行结果如下:

人生苦短,我用Python

从上面的执行结果中可以看出,在输出单个列表元素时,不包括中括号,如果是字符串,还不包括左右的引号。

3. 遍历元素

遍历列表中的所有元素是常用的一种操作,在遍历的过程中可以完成查询、处理等功能。

3.1 直接使用for循环实现

直接使用for循环遍历列表,只能输出元素的值,语法格式如下:

for item in listname:

    # 输出item

其中,item用于保存获取到的元素值,要输出元素内容时,直接输出该变量即可;listname为列表名称。

例如,定义一个保存2017~2018赛季NBA西部联盟前八名的列表,然后通过for循环遍历该列表,并输出各个球队的名称,代码如下:

print("2017~2018赛季NBA西部联盟前八名:")

team = ["休斯顿 火箭","金州 勇士","波特兰 开拓者","犹他 爵士","新奥尔良 鹈鹕","圣安东尼奥 马刺","俄克拉荷马城 雷霆","明尼苏达 森林狼"]

for item in team:
    print(item)

3.2 使用for循环和enumerate()函数实现

使用for循环和enumerate()函数可以实现同时输出索引值和元素内容,语法格式如下:

for index,item in enumerate(listname):
    # 输出index和item

参数说明:

  • index:用于保存元素的索引。

  • item:用于保存获取到的元素值,要输出元素内容时,直接输出该变量即可。

  • listname为列表名称。

例如,定义一个保存2017~2018赛季NBA西部联盟前八名的列表,然后通过for循环和enumerate()函数遍历该列表,并输出索引和球队名称,代码如下:

print("2017~2018赛季NBA西部联盟前八名:")

team = ["休斯顿 火箭","金州 勇士","波特兰 开拓者","犹他 爵士","新奥尔良 鹈鹕","圣安东尼奥 马刺","俄克拉荷马城 雷霆","明尼苏达 森林狼"]

for index,item in enumerate(team):
    print(index + 1,item) 

4. 添加、修改和删除列表元素

添加、修改和删除列表元素也称为更新列表。在实际开发时,经常需要对列表进行更新。

4.1 添加元素

可以通过“+”号将两个序列连接,通过该方法也可以实现为列表添加元素。但是这种方法的执行速度要比直接使用列表对象的append()方法慢,所以建议在实现添加元素时,使用列表对象的append()方法实现。列表对象的append()方法用于在列表的末尾追加元素,语法格式如下:

listname.append(obj)

其中,listname为要添加元素的列表名称,obj为要添加到列表末尾的对象。

例如,定义一个包括4个元素的列表,然后应用append()方法向该列表的末尾添加一个元素,可以使用下面的代码:

phone = ["摩托罗拉","诺基亚","三星","OPPO"]
len(phone)            		# 获取列表的长度
phone.append("iPhone")
len(phone)            		# 获取列表的长度
print(phone)

注意:列表对象除了提供append()方法可以向列表中添加元素,还提供了insert()方法也可以向列表中添加元素。该方法用于向列表的指定位置插入元素。但是由于该方法的执行效率没有append()方法高,所以不推荐这种方法。

如果想要将一个列表中的全部元素添加到另一个列表中,可以使用列表对象的extend()方法实现。extend()方法的语法如下:

listname.extend(seq)

其中,listname为原列表,seq为要添加的列表。语句执行后,seq的内容将追加到listname的后面。

4.2 修改元素

修改列表中的元素只需要通过索引获取该元素,然后再为其重新赋值即可。例如,定义一个保存3个元素的列表,然后修改索引值为2的元素,代码如下:

verse = ["长亭外","古道边","芳草碧连天"]
print(verse)
verse[2] = "一行白鹭上青天"                # 修改列表的第3个元素
print(verse)

4.3 删除元素

删除元素主要有两种情况,一种是根据索引删除,另一种是根据元素值进行删除。

根据索引删除:

删除列表中的指定元素和删除列表类似,也可以使用del语句实现。所不同的就是在指定列表名称时,换为列表元素。例如,定义一个保存3个元素的列表,删除最后一个元素,可以使用下面的代码:

verse = ["长亭外","古道边","芳草碧连天"]
del verse[-1]
print(verse)

根据元素值删除:

如果想要删除一个不确定其位置的元素(即根据元素值删除),可以使用列表对象的remove()方法实现。例如,要删除列表中内容为“公牛”的元素,可以使用下面的代码:

team = ["火箭","勇士","开拓者","爵士","鹈鹕","马刺","雷霆","森林狼"]
team.remove("公牛")

使用列表对象的remove()方法删除元素时,如果指定的元素不存在,将会报错。所以在使用remove()方法删除元素前,最好先判断该元素是否存在,改进后的代码如下:

team = ["火箭","勇士","开拓者","爵士","鹈鹕","马刺","雷霆","森林狼"]
value = "公牛"                	# 指定要移除的元素

if team.count(value)>0:      	# 判断要删除的元素是否存在
    team.remove(value)        	# 移除指定的元素
print(team)

说明:列表对象的count()方法用于判断指定元素出现的次数,返回结果为0时,表示不存在该元素。

5. 对列表进行统计和计算

Python的列表提供了内置的一些函数来实现统计、计算的功能。下面介绍几种常用的功能。

5.1 获取指定元素出现的次数

使用列表对象的count()方法可以获取指定元素在列表中的出现次数。基本语法格式如下:

listname.count(obj)

参数说明:

  • listname:表示列表的名称。

  • obj:表示要判断是否存在的对象,这里只能进行精确匹配,即不能是元素值的一部分。

  • 返回值:元素在列表中出现的次数。

例如,创建一个列表,内容为听众点播的歌曲列表,然后应用列表对象的count()方法判断元素“云在飞”出现的次数,代码如下:

song = ["云在飞","我在诛仙逍遥涧","送你一匹马","半壶纱","云在飞","遇见你","等你等了那么久"]
num = song.count("云在飞")
print(num)

5.2 获取指定元素首次出现的下标

使用列表对象的index()方法可以获取指定元素在列表中首次出现的位置(即索引)。基本语法格式如下:

listname.index(obj)

参数说明:

  • listname:表示列表的名称。

  • obj:表示要查找的对象,这里只能进行精确匹配。如果指定的对象不存在时,则抛出如图14所示的异常。

  • 返回值:首次出现的索引值。

例如,创建一个列表,内容为听众点播的歌曲列表,然后应用列表对象的index()方法判断元素“半壶纱”首次出现的位置,代码如下:

song = ["云在飞","我在诛仙逍遥涧","送你一匹马","半壶纱","云在飞","遇见你","等你等了那么久"]
position = song.index("半壶纱")
print(position)

说明:如果不存在就会报错。

5.3 统计数值列表的元素和

在Python中,提供了sum()函数用于统计数值列表中各元素的和。语法格式如下:

sum(iterable[,start])

参数说明:

  • iterable:表示要统计的列表。

  • start:表示统计结果是从哪个数开始(即将统计结果加上start所指定的数),是可选参数,如果没有指定,默认值为0。

例如,定义一个保存10名学生语文成绩的列表,然后应用sum()函数统计列表中元素的和,即统计总成绩,然后输出,代码如下:

grade = [98,99,97,100,100,96,94,89,95,100]        	# 10名学生的语文成绩列表

total = sum(grade)                                  # 计算总成绩

print("语文总成绩为:",total)

6. 对列表进行排序

在实际开发时,经常需要对列表进行排序。Python中提供了两种常用的对列表进行排序的方法:使用列表对象的sort()方法,使用内置的sorted()函数。

6.1 使用列表对象的sort()方法

列表对象提供了sort()方法用于对原列表中的元素进行排序。排序后原列表中的元素顺序将发生改变。列表对象的sort()方法的语法格式如下:

listname.sort(key=None, reverse=False)

参数说明:

  • listname:表示要进行排序的列表。

  • key:表示指定从每个元素中提取一个用于比较的键(例如,设置“key=str.lower”表示在排序时不区分字母大小写)。

  • reverse:可选参数,如果将其值指定为True,则表示降序排列;如果为False,则表示升序排列,默认为升序排列。

例如,定义一个保存10名学生语文成绩的列表,然后应用sort()方法对其进行排序,代码如下:

grade = [98,99,97,100,100,96,94,89,95,100]         	# 10名学生语文成绩列表
print("原列表:",grade)
grade.sort()                                      	# 进行升序排列
print("升  序:",grade)
grade.sort(reverse=True)                         	# 进行降序排列
print("降  序:",grade)

执行上面的代码,将显示以下内容:

原列表: [98, 99, 97, 100, 100, 96, 94, 89, 95, 100]
升  序: [89, 94, 95, 96, 97, 98, 99, 100, 100, 100]
降  序: [100, 100, 100, 99, 98, 97, 96, 95, 94, 89]

使用sort()方法进行数值列表的排序比较简单,但是使用sort()方法对字符串列表进行排序时,采用的规则是先对大写字母排序,然后再对小写字母排序。如果想要对字符串列表进行排序(不区分大小写时),需要指定其key参数。例如,定义一个保存英文字符串的列表,然后应用sort()方法对其进行升序排列,可以使用下面的代码:

char = ['cat','Tom','Angela','pet']
char.sort()                               # 默认区分字母大小写
print("区分字母大小写:",char)
char.sort(key=str.lower)                     # 不区分字母大小写
print("不区分字母大小写:",char)

运行上面的代码,将显示以下内容:

区分字母大小写: ['Angela', 'Tom', 'cat', 'pet']
不区分字母大小写: ['Angela', 'cat', 'pet', 'Tom']

说明:采用 sort() 方法对列表进行排序时,对中文支持不好。排序的结果与我们常用的音序排序法或者笔画排序法都不一致。如果需要实现对中文内容的列表排序,还需要重新编写相应的方法进行处理,不能直接使用sort()方法。

6.2 使用内置的sorted()函数实现

在Python中,提供了一个内置的sorted()函数,用于对列表进行排序。使用该函数进行排序后,原列表的元素顺序不变。sorted()函数的语法格式如下:

sorted(iterable, key=None, reverse=False)

参数说明:

  • iterable:表示要进行排序的列表名称。

  • key:表示指定从每个元素中提取一个用于比较的键(例如,设置“key=str.lower”表示在排序时不区分字母大小写)。

  • reverse:可选参数,如果将其值指定为True,则表示降序排列;如果为False,则表示升序排列,默认为升序排列。

例如,定义一个保存10名学生语文成绩的列表,然后应用sorted()函数对其进行排序,代码如下:

grade = [98,99,97,100,100,96,94,89,95,100]        # 10名学生语文成绩列表
grade_as = sorted(grade)                            # 进行升序排列
print("升序:",grade_as)
grade_des = sorted(grade,reverse = True)          # 进行降序排列
print("降序:",grade_des)
print("原序列:",grade)

执行上面的代码,将显示以下内容:

升序: [89, 94, 95, 96, 97, 98, 99, 100, 100, 100]
降序: [100, 100, 100, 99, 98, 97, 96, 95, 94, 89]
原序列: [98, 99, 97, 100, 100, 96, 94, 89, 95, 100]

说明:列表对象的 sort() 方法和内置 sorted() 函数的作用基本相同;不同点是在使用sort()方法时,会改变原列表的元素排列顺序,而使用 sorted() 函数时,会建立一个原列表的副本,该副本为排序后的列表。

7. 列表推导式

使用列表推导式可以快速生成一个列表,或者根据某个列表生成满足指定需求的列表。列表推导式通常有以下几种常用的语法格式。

(1)生成指定范围的数值列表,语法格式如下:

list = [Expression for var in range]

参数说明:

  • list:表示生成的列表名称。

  • Expression:表达式,用于计算新列表的元素。

  • var:循环变量。

  • range:采用range()函数生成的range对象。

例如,要生成一个包括10个随机数的列表,要求数的范围在10~100(包括)之间,具体代码如下:

import random            # 导入random标准库
randomnumber = [random.randint(10,100) for i in range(10)]
print("生成的随机数为:",randomnumber)

执行结果如下:

生成的随机数为: [38, 12, 28, 26, 58, 67, 100, 41, 97, 15]

(2)根据列表生成指定需求的列表,语法格式如下:

newlist = [Expression for var in list]

参数说明:

  • newlist:表示新生成的列表名称。

  • Expression:表达式,用于计算新列表的元素。

  • var:变量,值为后面列表的每个元素值。

  • list:用于生成新列表的原列表。

例如,定义一个记录商品价格的列表,然后应用列表推导式生成一个将全部商品价格打五折的列表,具体代码如下:

price = [1200,5330,2988,6200,1998,8888]
sale = [int(x*0.5) for x in price]
print("原价格:",price)
print("打五折的价格:",sale)

执行结果如下:

原价格: [1200, 5330, 2988, 6200, 1998, 8888]
打五折的价格: [600, 2665, 1494, 3100, 999, 4444]

(3)从列表中选择符合条件的元素组成新的列表,语法格式如下:

newlist = [Expression for var in list if condition]

参数说明:

  • newlist:表示新生成的列表名称。

  • Expression:表达式,用于计算新列表的元素。

  • var:变量,值为后面列表的每个元素值。

  • list:用于生成新列表的原列表。

  • condition:条件表达式,用于指定筛选条件。

例如,定义一个记录商品价格的列表,然后应用列表推导式生成一个商品价格高于5000元的列表,具体代码如下:

price = [1200,5330,2988,6200,1998,8888]
sale = [x for x in price if x>5000]
print("原列表:",price)
print("价格高于5000的:",sale)

执行结果如下:

原列表: [1200, 5330, 2988, 6200, 1998, 8888]
价格高于5000的: [5330, 6200, 8888]

8. 二维列表的使用

在Python中,由于列表元素还可以是列表,所以它也支持二维列表的概念。

8.1 直接定义二维列表

在Python中,二维列表是包含列表的列表,即一个列表的每一个元素又都是一个列表。在创建二维列表时,可以直接使用下面的语法格式进行定义:

listname = [[元素11, 元素12, 元素13,, 元素1n],
[元素21, 元素22, 元素23,, 元素2n],,
[元素n1, 元素n2, 元素n3,, 元素nn]]

参数说明:

  • listname:表示生成的列表名称。

  • [元素11, 元素12, 元素13, …, 元素1n]:表示二维列表的第一行,也是一个列表。其中“元素11,元素12,…元素1n”代表第一行中的列。

  • [元素21, 元素22, 元素23, …, 元素2n]:表示二维列表的第二行。

  • [元素n1, 元素n2, 元素n3, …, 元素nn]:表示二维列表的第n行。

例如,定义一个包含4行5列的二维列表,可以使用下面的代码:

verse = [['千', '山', '鸟', '飞', '绝'], ['万', '径', '人', '踪', '灭'],['孤', '舟', '蓑', '笠', '翁'], ['独', '钓', '寒', '江', '雪']]

8.2 使用嵌套的for循环创建

创建二维列表,可以使用嵌套的for循环实现。例如,创建一个包含4行5列的二维列表,可以使用下面的代码:

arr = []                      	# 创建一个空列表
for i in range(4):
    arr.append([])             	# 在空列表中再添加一个空列表
    for j in range(5):
        arr[i].append(j)       	# 为内层列表添加元素

上面代码在执行后,将创建以下二维列表:

[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]

8.3 使用列表推导式创建

使用列表推导式也可以创建二维列表,因为这种方法比较简洁,所以建议使用这种方法创建二维列表。例如,使用列表推导式创建一个包含4行5列的二维列表可以使用下面的代码:

arr = [[j for j in range(5)] for i in range(4)]

上面代码在执行后,将创建以下二维列表:

[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]

创建二维数组后,可以通过以下语法格式访问列表中的元素:

listname[下标1][下标2]

参数说明:

  • listname:列表名称。

  • 下标1:表示列表中第几行,下标值从0开始,即第一行的下标为0。

  • 下标2:表示列表中第几列,下标值从0开始,即第一列的下标为0。

例如,要访问二维列表中的第2行,第4列,可以使用下面的代码:

verse[1][3]

说明:list() 函数用于将字符串转换为列表;列表对象的 reverse() 方法用于对列表进行逆序排列,即将列表的最后一个元素移到第一个,倒数第二个元素移到第二个,以此类推。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值