八仙过海是一个中国民间故事,讲了汉钟离、张果老、韩湘子、铁拐李、吕洞宾、何仙姑、蓝采和和曹国舅八位神仙各显神通渡海的故事。
我们都知道变量只能被赋值为一个值,现在我们想把八位神仙的名字同时赋值,该如何实现呢?
在 Python 中,我们可以通过列表来实现。
列表是有序数据的集合。定义的语法是使用方括号 [ ] 括起来以逗号分隔的数据。
eight_immortal = ['汉钟离', '张果老', '韩湘子', '铁拐李', '吕洞宾', '何仙姑', '蓝采和', '曹国舅']print(eight_immortal)
eight_immortal 就是一个列表,[ ]包含的每一个信息称为元素,‘汉钟离’、‘张果老’、’韩湘子’等就是元素。
在 Python 中,列表有如下特性:
1.有序
列表不仅是数据的集合,而且这些数据还是有序的。
如果两个列表所包含的元素是相同的,但是元素的排列顺序不同,那么他们是两个不同的列表。
eight_immortal1 = ['汉钟离', '张果老', '韩湘子', '铁拐李', '吕洞宾', '何仙姑', '蓝采和', '曹国舅']eight_immortal2 = ['吕洞宾', '何仙姑', '蓝采和', '曹国舅', '汉钟离', '张果老', '韩湘子', '铁拐李']print(eight_immortal1 == eight_immortal2)
在上面的例子中,虽然包含的元素是相同的,都是八仙的名字,但是元素的顺序是不同的,所以是不同的两个列表。
2.元素的数据类型
同样的一个列表可以包含不同类型的数据。
eight_immortal = ['汉钟离', 1, '张果老', 2, '韩湘子', 3, '铁拐李', 4,'吕洞宾', 5, '何仙姑', 6, '蓝采和', 7, '曹国舅', 8]print(eight_immortal)
在上面的例子中既包含了字符串类型的数据,同时也包含了整数类型的数据。
使用引号包含的的数据类型是字符串!
3.元素可以重复
eight_immortal1 = ['铁拐李', '铁拐李', '何仙姑', '何仙姑', '蓝采和', '蓝采和']print(eight_immortal1)
在上面的例子中,‘铁拐李’, ‘何仙姑’, ‘蓝采和’ 这三个元素是重复的。
4.元素的访问
八仙兴高采烈地来到蓬莱阁上聚会饮酒。酒至酣时,铁拐李意犹未尽,对众仙说:“都说蓬莱、方丈、瀛洲三神山景致秀丽,我等何不去游玩、观赏?”众仙激情四溢,齐声附和。吕洞宾说:“我等既为仙人,今番渡海不得乘舟,只凭个人道法,意下如何?”众仙听了,欣然赞同,一齐弃座动身而去。
我们现在想从列表 eight_immortal 中提取出建议游玩三神山的铁拐李,要怎么操作呢?
大家可以一起回想下在介绍字符串时,介绍给大家的访问字符串中某一个字符的方法——索引,
我们可以通过索引的方式来访问列表中的元素,这个和访问字符串中的字符的原理是一样的。从前往后访问时,索引的下标从 0 开始。
我们看下 eight_immortal 这个列表的八仙的各个位置:
我们想要访问铁拐李,铁拐李的下标位置是3,我们只需要使用索引的方式:列表名[下标],也就是eight_immortal[3] 就可以了,我们一起来验证下,点击运行:
eight_immortal = ['汉钟离', '张果老', '韩湘子', '铁拐李', '吕洞宾', '何仙姑', '蓝采和', '曹国舅']print(eight_immortal[3])
下面的语句,大家在点击运行前,先自己判断下访问的是八仙中的哪一位呢?再运行,对比下结果!
eight_immortal = ['汉钟离', '张果老', '韩湘子', '铁拐李', '吕洞宾', '何仙姑', '蓝采和', '曹国舅']print(eight_immortal[0])print(eight_immortal[4])print(eight_immortal[7])
和访问字符串中的字符一样,我们还可以从后往前访问,当从后往前访问时,索引的下标从 -1 开始。
使用从后往前的索引,我们访问铁拐李的语句是:
eight_immortal = ['汉钟离', '张果老', '韩湘子', '铁拐李', '吕洞宾', '何仙姑', '蓝采和', '曹国舅']print(eight_immortal[-5])
eight_immortal = ['汉钟离', '张果老', '韩湘子', '铁拐李', '吕洞宾', '何仙姑', '蓝采和', '曹国舅']print(eight_immortal[-8])print(eight_immortal[-4])print(eight_immortal[-1])
当我们想一次访问列表中的多个元素时,比如我们想访问铁拐李、吕洞宾、何仙姑时,就可以使用切片啦!
切片操作对列表同样是适用的,语法是 列表名[m:n],访问的元素从索引 m 开始到索引 n 结束,不包括 n。
当不指定 m 和 n 时,也就是列表名[:] 访问的是整个列表;
当只指定 m ,不指定 n 时,列表名[m:] 访问的是从索引 m 开始,一直到列表结束的元素;
当只指定 n ,不指定 m 时,列表名[:n]访问的是从索引 0 开始,一直到索引 n 的元素,不包括索引 n 对应的元素。
铁拐李在列表中的位置是 3,吕洞宾是 4,何仙姑是 5,因此访问他们三个的语句是 eight_immortal[3:6]
eight_immortal = ['汉钟离', '张果老', '韩湘子', '铁拐李', '吕洞宾', '何仙姑', '蓝采和', '曹国舅']print(eight_immortal[3:6])print(eight_immortal[2:])print(eight_immortal[:5])print(eight_immortal[:])
同样的还可以使用负数索引。
eight_immortal = ['汉钟离', '张果老', '韩湘子', '铁拐李', '吕洞宾', '何仙姑', '蓝采和', '曹国舅']print(eight_immortal[-5:-2])print(eight_immortal[-5:])print(eight_immortal[:-2])print(eight_immortal[:])
在进行切片操作时,还可以指定索引的步长。
我们首先一起了解下步长指的是什么?
大家小的时候有没有下过跳棋,我们可以往前跳一步,就是跳一个格子,步长即为 1;也可以跳两步,就是跳两个格子,步长就是 2,我们一起来看下 eight_immortal 这个列表各元素间的步长:
了解步长的含义之后,我们来看步长的表达。
列表名[m:n:步长] 步长在实际的编程中,是用数据表示的,1 表示 1 步,2 表示 2 步,步长也可以省略,省略时步长默认为 1。
我们一起来看下下方语句:
大家在运行前,先自己判断下运行结果:
eight_immortal = ['汉钟离', '张果老', '韩湘子', '铁拐李', '吕洞宾', '何仙姑', '蓝采和', '曹国舅']print(eight_immortal[0:7:2])
5.列表可以嵌套
列表中的元素同样可以是一个列表。
my_list = ['a', ['bb', ['ccc', 'ddd'], 'ee', 'ff'], 'g', ['hh', 'ii'], 'j']print(my_list)
我们看到在 my_list 这个列表中有 5 个元素,其中 3 个是字符型,2 个是列表,而[‘bb’,[‘ccc’,‘ddd’],‘ee’,‘ff’] 这个列表中又嵌套了一个列表,在判断列表中的嵌套时,我们主要是根据[]来进行判断:
嵌套的列表共占元素的一个位置,具体位置信息我们一起来看图:
我们看到对于只嵌套一个的列表,访问其中某个元素时,索引的使用方法是列表名[嵌套列表的位置][所需访问的元素在嵌套列表的位置],比如,我们想访问hh,方法就是my_list[3][0],3 是嵌套列表在 my_list 中的位置,0 是 hh 在嵌套列表中的位置。
如果我们想访问 ddd,索引为 my_list[1][1][1]。
我们一起看下下方语句,还是在运行前,我们先判断下结果哈!
my_list = ['a', ['bb', ['ccc', 'ddd'], 'ee', 'ff'], 'g', ['hh', 'ii'], 'j']print(my_list[0])print(my_list[1])print(my_list[1][0])print(my_list[1][1][0])
6.列表元素可以修改
6.1 改变元素的值
6.1.1 一次改变一个值
逍遥闲散的汉钟离,把手中的芭蕉扇甩开扔到大海里,那扇子大如蒲席,他醉眼惺忪地跳到迎波踏浪的扇子上,悠哉悠哉地向大海深处漂去。清婉动人的何仙姑步其后尘,将荷花往海里一放,顿时红光四射,花像磨盘,仙姑亭亭玉立于荷花中间,风姿迷人。众仙谁也不甘落后。吟诗行侠的吕洞宾、倒骑毛驴的张果老、隐迹修道的曹国舅、振靴踏歌的蓝采和、巧夺造化的韩湘子、借尸还魂的铁拐李纷纷将宝物扔入海中。瞬间,百舸争流,各显神通,逞雄镇海,悠然地遨游在万顷碧波之中。
我们现在想把列表中的’汉钟离’修改成’逍遥闲散’,把列表中的’何仙姑’修改成’清婉动人’,我们可以先使用索引定位到需要修改的元素位置,再通过赋值的方式将修改后的内容赋值给对应元素:
eight_immortal[0] = ‘逍遥闲散’
eight_immortal[5] = ‘清婉动人’
eight_immortal = ['汉钟离', '张果老', '韩湘子', '铁拐李', '吕洞宾', '何仙姑', '蓝采和', '曹国舅']eight_immortal[0] = '逍遥闲散'eight_immortal[5] = '清婉动人'print(eight_immortal)
6.1.2 一次改变多个值
现在我们想将’汉钟离’修改成’逍遥闲散’,‘张果老’修改成’倒骑毛驴’,‘韩湘子’修改成’巧夺造化’,
当然我们可以采用逐一修改的方式,但是代码规范中有一个要求就是代码的简洁程度,能同时修改的值尽量不多次修改,下面呢,我们就给大家介绍可以一次性修改多个值的方法:
我们观察到在 eight_immortal 列表中,‘汉钟离’、‘张果老’、’韩湘子’是可以通过切片的方式同时访问到的,因此我们先通过切片定位到这些元素的位置,再将修改后的值通过[]逐一赋值给他们。
eight_immortal = [‘汉钟离’, ‘张果老’, ‘韩湘子’, ‘铁拐李’, ‘吕洞宾’, ‘何仙姑’, ‘蓝采和’, ‘曹国舅’]
eight_immortal[0:3] = [‘逍遥闲散’, ‘倒骑毛驴’,‘巧夺造化’]
eight_immortal = ['汉钟离', '张果老', '韩湘子', '铁拐李', '吕洞宾', '何仙姑', '蓝采和', '曹国舅']eight_immortal[0:3] = ['逍遥闲散', '倒骑毛驴','巧夺造化']print(eight_immortal)
我们也可以将列表中元素的值修改为整型,比如下方语句
eight_immortal = ['汉钟离', '张果老', '韩湘子', '铁拐李', '吕洞宾', '何仙姑', '蓝采和', '曹国舅']eight_immortal[0:3] = [10, 20, 30]eight_immortal[-5:-1] = [40, 50, 60, 70]print(eight_immortal)
6.2 删除元素
我们想把八仙中的张果老从列表中删除,只需要使用 del 就可以了
del 列表名[],铁拐李在列表中的位置为 eight_immortal[1],因此删除语句为 del eight_immortal[1]
eight_immortal = ['汉钟离', '张果老', '韩湘子', '铁拐李', '吕洞宾', '何仙姑', '蓝采和', '曹国舅']del eight_immortal[1]print(eight_immortal)
我们也可以使用 del 来进行多个元素的删除,del 列表名[m:n],我们运行下方语句:
eight_immortal = ['汉钟离', '张果老', '韩湘子', '铁拐李', '吕洞宾', '何仙姑', '蓝采和', '曹国舅']del eight_immortal[0:3]print(eight_immortal)
6.3 使用+往列表中增加元素
八仙的传说起源很早,但人物有多种说法。如淮南八仙,所指西汉淮南王刘安著成《淮南子》的八公,淮南王好神仙丹药,后世传其为仙。五代时道士作画幅为蜀中八仙,所画人物有容成公、李耳、董仲舒、张道陵、严君平、李八百、范长生、尔朱先生。
现在我们想把容成公、李耳、董仲舒、张道陵、严君平、李八百、范长生、尔朱先生都包含在列表eight_immortal中,该怎么添加呢?
在 Python 中,我们使用+往列表中添加元素,添加的元素会自动的被添加到列表尾部:
列表名 += [元素1,元素2,元素3,…,元素n]
因此语句为:
eight_immortal = ['汉钟离', '张果老', '韩湘子', '铁拐李', '吕洞宾', '何仙姑', '蓝采和', '曹国舅']print(eight_immortal)eight_immortal += ['容成公', '李耳', '、董仲舒','张道陵','严君平','李八百','范长生','尔朱先生']print(eight_immortal)
我们看到添加的内容在列表 eight_immortal 原有元素之后。
6.4 改变列表的方法
6.4.1 append()
除了使用+,append() 也可以为列表添加元素,和+一样,也是在列表的结尾处添加元素,可以添加一个元素或列表。
我们看下方语句:
eight_immortal = ['汉钟离', '张果老', '韩湘子', '铁拐李']print(eight_immortal)eight_immortal.append('吕洞宾')print(eight_immortal)eight_immortal.append(['何仙姑', '蓝采和', '曹国舅'])print(eight_immortal)
使用+和append()都是在列表的结尾处添加元素,那如果是想在列表的开始处添加元素或者是在列表中的任意位置添加元素需要如何实现呢?
6.4.2 insert()
在 Python 中,insert() 可以在指定位置插入一个元素或列表。
语法是:insert(n, 需要添加的元素/列表值),n 为需要插入元素或列表的指定位置。
eight_immortal = ['汉钟离', '张果老', '韩湘子', '铁拐李']print(eight_immortal)eight_immortal.insert(3, '吕洞宾')print(eight_immortal)eight_immortal.insert(4, ['何仙姑', '蓝采和', '曹国舅'])print(eight_immortal)
在列表的指定位置插入了相应的元素和列表。
6.4.3 remove()
我们可以在列表中添加元素,也可以删除元素,我们使用 remove(元素值) 从列表中删除指定的元素,如果指定的元素在列表中不存在,则会报错。
比如:
eight_immortal = ['汉钟离', '张果老', '韩湘子', '铁拐李', '吕洞宾', '何仙姑', '蓝采和', '曹国舅']print(eight_immortal)eight_immortal.remove('汉钟离')print(eight_immortal)eight_immortal.remove('骆宾王')
6.4.4 pop(index)
除了 remove(),我们还可以使用 pop(index) 来删除指定元素,index 为元素在列表中的位置。
pop(index) 语法规则为:列表名.pop(index),从列表中删除指定索引上的元素,如果不指定 index,默认删除最后一个元素。
eight_immortal = ['汉钟离', '张果老']print(eight_immortal)eight_immortal.pop()print(eight_immortal)
我们看到 pop() 没有指定元素位置,则列表中最后一个元素’张果老’被删除了。
我们再一起看下指定元素位置的情况,运行下方语句:
eight_immortal = ['汉钟离', '张果老', '韩湘子', '铁拐李', '吕洞宾', '何仙姑', '蓝采和', '曹国舅']print(eight_immortal)eight_immortal.pop(1)print(eight_immortal)
我们看到列表中删除了指定元素’张果老’。
都是删除元素,pop()和 remove() 主要有两点不同:
pop()传入的参数为索引值,而不是具体的元素值。pop()的返回值为删除的元素。
我们可以通过一个变量,来看下 pop() 的返回值
eight_immortal = ['汉钟离', '张果老', '韩湘子', '铁拐李', '吕洞宾', '何仙姑', '蓝采和', '曹国舅']name = eight_immortal.pop(1)print(name)
打印出的结果是张果老,也就是 pop(1) 返回的值。
小试牛刀
1、seven_sage = [‘山涛’, ‘阮籍’, ‘刘伶’, ‘嵇康’, ‘向秀’, ‘阮咸’, ‘王戎’],通过列表索引的方法打印出 ‘山涛’。
2、seven_sage = [‘山涛’, ‘阮籍’, ‘刘伶’, ‘嵇康’, ‘向秀’, ‘阮咸’, ‘王戎’],通过列表切片的方法打印出 ‘山涛’, ‘阮籍’, ‘刘伶’, ‘嵇康’。
3、seven_sage = [‘山涛’, ‘阮籍’, ‘刘伶’, ‘嵇康’, ‘向秀’, ‘阮咸’, ‘王戎’],删除元素 ‘阮籍’。