列表与元组

描述

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 列表的修改

修改列表内的元素时,直接重新赋值就好了。

赋值的方法是:列表名[索引] = 新内容

数据

数据

数据

  1. 元组

元组(tuple),是一种数据类型。

与列表在形式上有一个区别:

列表用中括号[],而元组是用小括号()。

数据

元组可以存储大量数据,

和列表一样都可以用同样的方式取值,

都可以用同样的方式切片等。

数据

数据

元组和列表最大的不同之处在于:

元组,一经创建则不可修改。

如果元组里只有一个元素,后面也要加逗号,如 foods = ('龟苓膏',),

如果不加逗号的话,

那它就不会被判定成元组。

  1. 序列
  2. 序列的概念

列表和元组都是由按顺序排列的数据组成的。

在 Python 中,把像列表和元组这样的数据类型,都叫做序列。

序列:就是一组多个数据按顺序排成一列。

序列内有一个个元素,

每个元素都有对应的索引,

用于标记元素的位置。

还有一类序列,字!符!串!

字符串本质上也可以理解成,

一个个字符按照一定的顺序排列起来的串儿。

引号内每一个字符都按着一定的顺序排列,

并且每个字符也是有对应的索引的。

所以它叫字符串,完美符合序列的定义。

作为序列,

它们都有元素以及元素所对应的索引,

并都可以进行索引取值、切片、等操作。

数据

  1. 成员运算符

序列可以进行某个元素是否在序列内的判断。

以 skills = ['英语六级', '吉他'] 举个例子。

假如我们想要判断一项能力(元素)是否还在我掌握的技能(skills 列表)里,该怎么做呢?

Python 里有成员运算符 in,

可以判断一个元素是否在某一个序列中。

结合 if 来判断某个元素是否在序列内时,

常见写法是:if 元素 in 序列,

可以理解为如果某个元素在列表内,

就执行一些代码。

数据

数据

拓展一个知识点,

如果想要判断一个元素是否不存在列表呢,

可以用:if 元素 not in 序列 来判断。

数据

数据

17、序列拓展:len count list

  1. 课前说明

之前学习了列表、元组、字符串这类序列,

本次课程学习 3 个序列的应用方法。

不妨想象一下,你即将担任将军,

前任将军,给你留了一支部队,

部队的变量名为 army,用 python 如下图表示:

army =('炮兵', '步兵', '步兵', '步兵', '医疗兵', '步兵', '步兵', '炮兵', '步兵', '步兵', '医疗兵', '步兵', '步兵', '炮兵', '步兵', '步兵', '医疗兵', '步兵', '步兵')

部队的数据类型是元组,士兵相当于元组里的元素。

新官上任,第一步要做的就是清点部队一共有多少人,

方便后续对部队重新整编。

如何清点呢?

这里有一个函数:len(),刚好能够帮助到你。

  1. len()

len 是 length 的缩写,中文是长度的意思。

对于列表和元组这类序列来说,

所谓长度是指元素的个数。

将列表、元组、字符串等数据类型传入到 len() 中,

其长度将以整数形式返回。

数据

数据

打印出返回的结果是 3 ,

说明该元组的长度为 3 ,

即有 3 个元素。

尝试用 len() 来清点一下你的部队一共有多少人吧。

数据

数据

你在终端看到返回结果为 19 ,

代表部队中一共有 19 名士兵。

数据

  1. count()

count 在英文里是计算的意思。

序列.count(元素)。

一支部队里还有各类兵种,他们人数不一。

我们还需要清算部队各兵种的数量。

count()用于统计序列(包括:列表、元组等)中某个元素出现的次数。

count()会以整数的数据类型返回该元素在序列内的个数。

用count()统计混在兔中的免的个数。

数据

数据

如终端所示,一共有 3 个免。

类比到你的部队,count()就是相当于要士兵报数。

若传入参数'炮兵'到count()中,那么就返回'炮兵'的个数。

数据

数据

数据

需要注意的是:len()、count()返回的数据类型是整数,

所以要用 str() 转化为字符串后才可以与字符串作拼接。

  1. list()

List:中文的意思是列表。

为什么将部队设置元组,而不是列表呢?

之所以将各个部队都设置为元组而非列表,

是为了防止人员(元组 army 内的元素)随意变动。

现在想加强军队训练,需要添加一位教官来管理。

注意,元组没法对内部的元素做修改、增加等操作,

这时候就需要用 list() 做数据转换啦。

list 在英文中就是列表的意思,

将需要转换的数据类型作为参数输入list()中,

就可以把它转换为对应的数据类型。

我们来看一个将元组转换为列表的例子,

数据

数据

打印结果显示元组('a', 'b', 'c')的小括号变成['a', 'b', 'c']的中括号了,

说明它已经成功将元组转换成列表的形式进行输出。

需要注意的是,list() 只是将元组转换成列表的形式,

元组的本身并不会发生改变。

将元组 army 转换为列表后,添加一个新的元素 '教官'。

数据

数据

数据

  1. 总结归纳

数据

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转换为整数

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分