13、列表拓展
1.列表的元素
首先,我们来聊聊列表的元素。
虽然你已经有所了解,
但还是看看下面这张图复习一下。
在编程里,列表中的数据被称为列表的元素。
以上面例子来看,列表 skills 中有两个元素,
分别是 '英语六级' 和 '吉他',
且这两个元素都是字符串。
列表是一个包容的数据类型.
其中的元素可以为任意数据类型,
包括整数、浮点数、字符串,列表,
以及后续我们会学到的元组,字典等。
举个例子,我们以 bag 来代表知枫的书包,
pen_bag 来代表书包内的笔袋。
我们先阅读一段代码。
在这串代码里面,我创建了两个列表,
分别为:bag 和 pen_bag。
其中在列表 bag 里面,一共有三个元素,
包括两个字符串:'电脑','雨伞';
以及一个我们创建的列表 pen_bag。
我们打印一下列表 bag 看看。
此时你可以看到终端显示为:
['电脑', '雨伞', ['笔', '尺子', '涂改液']] 这个结果。
也就是说,列表中的列表,同样是一个元素。
这就好比知枫的书包里可以放电脑外,
还可以再放一个小包装笔尺。
列表元素可以是任何数据类型。
它不止像上面这个例子那样,
可以是一个列表,
它还可以是我们后面会学到的字典和元组。
总之,无论是什么数据类型,
我们都可以把它看成一个元素。
打印出来的两个结果是两个一样的列表。
这是因为创建列表时,直接将数据写在里面,
和使用变量来代替的效果是一样的。
2 索引取值
列表中的每个元素都有其对应位置的数字编号,即索引。
只要在列表后面加一个中括号 [],
Python 里从 0 开始计数,
所以 '吉他' 的索引是 1,
'英文六级'的索引是 0。
例如:list[n] 它表示的是:
从左往右数,第 n+1 个元素。
除此之外,Python 还支持用负数做索引,
比如 list[-n] 它表示的是:
从右往左数,第 n 个元素。
所以如果你想提取列表 skills 中的 '吉他',
你还可以写成:skills[-1]。
用负数做索引这种用法会使用在你不知道列表有多长,
但你就是想拿到最后倒数第 n 个元素的时候。
【代码练习】把小包 bag 中的'笔'拿出来。
第一步我们先要从书包 bag 把小包 pen_bag 拿出来。
第二步我们需要把小包 bag 中的'笔'拿出来。
这个过程,很像剥洋葱,
一层一层地去把列表打开,拿到我们想要的东西。
总结一下,当需要两次索引的时候,
在 Python 上的格式为:list[索引][索引]。
3.3 列表的切片
索引 [a:b] 的切取范围是:a <= X < b
要从列表里取多个元素怎么办?
此时,我们会用到一种新的技巧:切片 。
切片即在列表中切取一段数据,
生成一个新的列表。
在切片时,索引 [a:b] 的切取范围是:
a <= X < b,
左边有等于号,而右边是没有等于号的。
对照着看上面的图片,
给列表中的每个元素前面都加上它的索引。
切片,就是取出两个索引中间夹着的元素。
口诀:“列表切片怎么用,记好取左不取右”。
冒号左右的值可以不填,
不填的时候则代表一取到底。
3.4 添加列表的元素
append :添加的意思。
用法格式是:列表名.append(元素)。
通过 append() 添加元素,
元素会被添加到列表的最后一个位置。
3.5 列表的修改
修改列表内的元素时,直接重新赋值就好了。
赋值的方法是:列表名[索引] = 新内容
元组(tuple),是一种数据类型。
与列表在形式上有一个区别:
列表用中括号[],而元组是用小括号()。
元组可以存储大量数据,
和列表一样都可以用同样的方式取值,
都可以用同样的方式切片等。
元组和列表最大的不同之处在于:
元组,一经创建则不可修改。
如果元组里只有一个元素,后面也要加逗号,如 foods = ('龟苓膏',),
如果不加逗号的话,
那它就不会被判定成元组。
列表和元组都是由按顺序排列的数据组成的。
在 Python 中,把像列表和元组这样的数据类型,都叫做序列。
序列:就是一组多个数据按顺序排成一列。
序列内有一个个元素,
每个元素都有对应的索引,
用于标记元素的位置。
还有一类序列,字!符!串!
字符串本质上也可以理解成,
一个个字符按照一定的顺序排列起来的串儿。
引号内每一个字符都按着一定的顺序排列,
并且每个字符也是有对应的索引的。
所以它叫字符串,完美符合序列的定义。
作为序列,
它们都有元素以及元素所对应的索引,
并都可以进行索引取值、切片、等操作。
序列可以进行某个元素是否在序列内的判断。
以 skills = ['英语六级', '吉他'] 举个例子。
假如我们想要判断一项能力(元素)是否还在我掌握的技能(skills 列表)里,该怎么做呢?
Python 里有成员运算符 in,
可以判断一个元素是否在某一个序列中。
结合 if 来判断某个元素是否在序列内时,
常见写法是:if 元素 in 序列,
可以理解为如果某个元素在列表内,
就执行一些代码。
拓展一个知识点,
如果想要判断一个元素是否不存在列表呢,
可以用:if 元素 not in 序列 来判断。
17、序列拓展:len count list
之前学习了列表、元组、字符串这类序列,
本次课程学习 3 个序列的应用方法。
不妨想象一下,你即将担任将军,
前任将军,给你留了一支部队,
部队的变量名为 army,用 python 如下图表示:
army =('炮兵', '步兵', '步兵', '步兵', '医疗兵', '步兵', '步兵', '炮兵', '步兵', '步兵', '医疗兵', '步兵', '步兵', '炮兵', '步兵', '步兵', '医疗兵', '步兵', '步兵')
部队的数据类型是元组,士兵相当于元组里的元素。
新官上任,第一步要做的就是清点部队一共有多少人,
方便后续对部队重新整编。
如何清点呢?
这里有一个函数:len(),刚好能够帮助到你。
len 是 length 的缩写,中文是长度的意思。
对于列表和元组这类序列来说,
所谓长度是指元素的个数。
将列表、元组、字符串等数据类型传入到 len() 中,
其长度将以整数形式返回。
打印出返回的结果是 3 ,
说明该元组的长度为 3 ,
即有 3 个元素。
尝试用 len() 来清点一下你的部队一共有多少人吧。
你在终端看到返回结果为 19 ,
代表部队中一共有 19 名士兵。
count 在英文里是计算的意思。
序列.count(元素)。
一支部队里还有各类兵种,他们人数不一。
我们还需要清算部队各兵种的数量。
count()用于统计序列(包括:列表、元组等)中某个元素出现的次数。
count()会以整数的数据类型返回该元素在序列内的个数。
用count()统计混在兔中的免的个数。
如终端所示,一共有 3 个免。
类比到你的部队,count()就是相当于要士兵报数。
若传入参数'炮兵'到count()中,那么就返回'炮兵'的个数。
需要注意的是:len()、count()返回的数据类型是整数,
所以要用 str() 转化为字符串后才可以与字符串作拼接。
List:中文的意思是列表。
为什么将部队设置元组,而不是列表呢?
之所以将各个部队都设置为元组而非列表,
是为了防止人员(元组 army 内的元素)随意变动。
现在想加强军队训练,需要添加一位教官来管理。
注意,元组没法对内部的元素做修改、增加等操作,
这时候就需要用 list() 做数据转换啦。
list 在英文中就是列表的意思,
将需要转换的数据类型作为参数输入list()中,
就可以把它转换为对应的数据类型。
我们来看一个将元组转换为列表的例子,
打印结果显示元组('a', 'b', 'c')的小括号变成['a', 'b', 'c']的中括号了,
说明它已经成功将元组转换成列表的形式进行输出。
需要注意的是,list() 只是将元组转换成列表的形式,
元组的本身并不会发生改变。
将元组 army 转换为列表后,添加一个新的元素 '教官'。
18、列表元组课后练习
【牛刀小试】
选择题 1 - 序列 & 数据类型
字符串是序列的一种,而且属于不可变数据类型。
多选题:根据以上信息,请你选出正确的选项:
A. 字符串不可以进行切片
B. 字符串可以增加元素,但是不能删除元素
C. 字符串内每一个字符都是按着一定的顺序排列的
D. 字符串一经创建之后,就不能修改
答案:CD
A序列都可以进行索引取值和切片,字符串是序列的一种,因此可以进行切片。
B 不可变数据类型一经创建就不可修改,字符串属于不可变数据类型,因此既不能增加元素,也不能删除元素。
选择题 2 - 索引 & 切片
阅读下面这两行代码,并结合你对列表和元组的理解,完成选择题。
num_list = [1, 3, 5, 7, 9, 11, 13]
num_tuple = (1, 3, 5, 7, 9, 11, 13)
单选题:观察选项中的代码,选出正确的一项:
A. num_list[-2] 的结果是:[11]
B. num_list[2:3] 的结果是:[5, 7]
C. num_tuple[4] 的结果是:(9,)
D. num_tuple[5:6] 的结果是:(11,)
答案是D
A num_list[-2] 表示列表的负向索引,只能取到数值,而不是选项中的列表。
B num_list[2:3] 表示列表的切片,按照“取左不取右”的原则,只能取到从左到右第 2+1 个元素组成的列表 [5],而非选项中的 [5, 7]。
C num_tuple[4] 表示元组的索引,同样只能取到数值,而不是选项中的元组 (9,)。
D num_tuple[5:6] 表示元组的切片,可以取到从左到右第 5+1 个元素组成的元组,即 (11,)。
运行代码验证:
选择题 3 - 成员运算符
单选题:请你选出结果为 True 的选项:
A. print(4 in [1, 2, 3, [4, 5, 6]])
B. print(4 in [4, 5, 6])
C. print(4 in [[4, 5, 6]])
答案是 B
观察三个选项,可以看到其中的代码功能是判断整数 4 是否在某个列表中。
如果在,输出结果为真;否则,输出结果为假。
A 选项中,[1, 2, 3, [4, 5, 6]] 是一个嵌套列表,它有四个元素,分别是 1,2,3 以及 [4, 5, 6]。
4 并非其中任何一个元素,因此不在该嵌套列表中,输出结果为 False。
B 选项中,[4, 5, 6] 是一个普通的列表,它有三个元素,分别是 4,5,6。
整数 4 在该列表中,因此输出结果为 True。
C 选项中,[[4, 5, 6]] 是一个嵌套列表,仅有一个元素 [4, 5, 6]。
因此,整数 4 不在该嵌套列表中,输出结果为 False。
运行代码验证一下吧:
选择题 4 - 成员运算符
小强下班坐公交回家,他的选择有三种,
分别是 301、209、355 路公交。
为了让他能够准确地坐上公交回家,需要补全下面的代码块:
choice = ['301', '209', '355']
bus = input('来了一辆公交,号码是:')
[条件判断语句]
print('坐这辆公交回家')
多选题:请你选出合理的条件判断语句:
A. if bus in choice:
B. if bus == choice:
C. if bus == '301' or bus == '209' or bus == '355':
D. if bus == '301' and bus == '209' and bus == '355':
答案是 A、C
简单理解一下题意:我们要判断“来了一辆公交,这辆公交的号码”是否在列表 ['301', '209', '355'] 中。
很明显借助成员运算符 in 就可以实现,所以我们先把 A 选上。再来看选项 B、C、D。
B 选项中,if bus == choice: 成立的前提是同时看到是三辆公交车,与我们获取的输入值(一辆公交)相悖,所以直接舍弃。
C 选项中,if bus == '301' or bus == '209' or bus == '355': 表示来的公交车可以是 301 或者 209 或者 355,只要是其中任何一个,条件都可以成立。这个条件符合我们的需求。
D 选项和 B 选项实现的功能相同,直接舍弃。
代码题 5 - 索引 & 列表的修改
“狸猫换太子”:请你按照下面的注释补充代码。
我的答案:
皇家婴儿名单是一个嵌套列表,该嵌套列表中的第 3 个元素['三公主', '太子']中的第 2 个元素就是'太子',因此,使用 baby_list[2][1] 即可“找到太子”。
“找到太子”后,使用相同的索引可将元素'太子'换成元素'狸猫'”,实现该列表元素的修改,即 baby_list[2][1] = '狸猫'
实战 1 - 成员运算符 & 列表
智能签到系统
【练习介绍【】】
签到,对于我们来说再平常不过了。无论上班打卡,亦或参加某项活动,都少不了签到这一环节。常见的有人脸识别、指纹识别、填写姓名等签到方式。在这里,我们就以填写姓名这种方式为依据,设计一个简易的智能签到系统,避免重复签到。
【题目要求】
通过自主输入姓名,判断是否签到。如果已经签到,提示用户无需重复签到;否则,提供是否签到选项。
详细的逻辑可以参考下方代码块:
给你一点点提示:
1)变量名建议:姓名 —— name;签到名单 —— attendance_list;回答 —— answer。
我的答案:
实战 2 - 索引
设计摇奖机
【练习介绍】
不知道你有没有玩过摇奖机,只要摇动摇杆,屏幕中间的三个图案轮就会飞快转动。当图案轮旋转停止,显示的三个图案如果相同,即为中奖。
在这里,我们做一个简易的摇奖机。
可以把列表当做“数字转盘”,为了降低操作难度,我已经为你提供了三个列表。
num_list1 = ['0', '1', '0', '1', '1', '0', '1', '0', '1', '0']
num_list2 = ['0', '1', '1', '1', '0', '0', '1', '0', '0', '1']
num_list3 = ['1', '0', '1', '1', '0', '1', '1', '0', '1', '1']
每个列表包含 10 个乱序的数字字符串,只有 '0' 和 '1'两种。
然后,把“输入一个三位数”当成“摇奖”这个动作,并把这个三位数的百位数、十位数、个位数作为索引,分别对列表取值,组成兑奖码。
以 223 这个三位数为例,对三个列表分别索引取值,组成的兑奖码是 011。
【题目要求】
随机输入一个三位数(000 - 999),可以获得一个专属的兑奖码,当兑奖码为 111 或 000 时,即为中奖,否则,未中奖。
给你一点点提示:
1)变量名建议:输入的三位数 —— num,三位数中的百位数 —— hundreds_digit,三位数中的十位数 —— tens_digit,三位数中的个位数 —— ones_digit,兑换码 —— code。
我的答案:
Input 输入的是字符串,需要用int转换为整数
全部0条评论
快来发表一下你的评论吧 !