目录
目标
在昨天的博文中我们学习了一种数据结构 —— 元组。今天,我们来学习一下另外一种数据结构 —— 列表。
列表
列表又叫List,与元组的结构类似,也可以用于存储多个类型的数据。接下来,我们一起学习列表的用法。
这2行代码定义了一个叫做“friendName”的列表,并输出了列表中的内容。第1行代码给这个列表friendName赋值,包含三个字符串数据:Kevin,Tony,Asum。第2行代码输出了整个列表。
friendName = ["Kevin", "Tony", "Asum"]
print(friendName)
friendName
变量名,用来存储这个列表。
[]
一对中括号,是定义列表的固定格式。
,
逗号,列表内部数据之间使用逗号分隔开。
空格
两个空格,这里的空格不是必须的,只是为了考虑代码风格,建议在逗号后面加上空格。
字符串
三个字符串,是friendName这个列表中包含的具体数据。
我们知道元组中可以存储多种类型的数据。列表与元组一样,列表中的数据元素可以是任何一种类型,如图所示,整型、浮点型、布尔数等。
除此之外,列表中的数据也可以是整型,浮点型,字符串或布尔数的任意组合。如图所示,列表mixedList中,包含整型、浮点型和字符串三种数据类型。
取单个元素
昨天学过,使用索引能够获取元组中的元素,列表与元组类似,也可以使用索引。如图所示,取第一个元素,使用players[0],取第四个元素,就使用players[3](索引从0开始)。
Debug
列表在索引时最容易出现以下 bug:
索引错误:列表中有6个元素,从0开始索引,最大的索引为5。当索引的值超过5以后,就会出现越界。 提示:列表索引超出范围(IndexError: list index out of range)。
切片
我们知道索引用于取单个元素,如果要提取列表中的多个连续的元素,该怎么操作呢?
接下来,我们先学习切片的概念。
定义:编程中的切片能对元组、列表等有序数据结构进行处理,以截取数据中连续的片段,方便使用。
隐喻:隐喻就像从长条面包里面切出某一段面包一样,从一段线性排列的数据中选取某一段数据。
切片操作
学习了切片的概念后,要在代码中使用切片提取数据,该怎样操作呢?
这段代码做的事情是定义了一个叫做"someLetters"的列表。第2行代码截取了列表中的第二个和第三个元素。
someLetters = ["a", "b", "c", "d", "e"]
print(someLetters[1:3])
定义列表
第1行两侧的一对中括号[],表明数据类型为列表,列表中的每个元素都是字符串。将列表赋值给变量名someLetters,因此,列表名称为someLetters,列表内容为["a", "b", "c", "d", "e"]。
[]
第2行中列表+中括号([]),括号中既有数字也有冒号(:),表明要对列表进行切片。
:
利用切片取元素时,需要使用冒号,用于分隔切片开始的位置和切片终止的位置。
数字
切片要遵循“左闭右开”原则,就是取左边的数据,不取右边的数据,与数学中的区间类似[1, 3),取左不取右。注意:切片与索引类似,也是从0开始,即第一个元素的索引为0。
例如,第2行中的someLetters[1:3],索引从0开始,这里就是取第2个元素到第4个元素。又需要遵循“左闭右开”原则,则取第2个到第3个元素,输出['b', 'c']。
切片时,开始位置和结束位置的数字,还有三种填写情况。
1. 只填写结束位置的数字;
2. 只填写开始位置的数字;
3. 两侧数字都不填写。
接下来,我们将会讲解这三种情况。
1. 开始位置数字不填,默认从第一个元素开始切片。根据“左闭右开”原则,如图,从第一个元素(含)开始,取到第三个元素(含)。
2. 结束位置数字不填,默认从开始位置切片,取到最后一个元素。
注意:不填写结束位置的数字时,列表中最后一个元素也会被提取。如图,表示从第二个元素(含)开始,到最后一个元素(含)结束。
3. 开始位置和结束位置都不填写时,就是取列表中的所有元素。如图,[:]直接取出所有元素,但这种用法不常见,了解即可。
切片在元组中的应用
学习了列表的切片方法后,昨天学习的元组也可以使用切片来截取一段数据,如图所示。
列表的修改
学习了索引和切片访问列表中数据的方式后,如果,某个列表中的数据定义错误了,想要进行修改,该怎样操作呢?
这5行代码定义了一个叫做“friendName”的列表,并输出了不同的结果。
第1行给列表friendName赋值了三个数据:Kevin,Tony,Asum。
第2行输出整个列表。
第3行输出列表中的第一个数据,也就是字符串"Kevin"。
第4行通过代码friendName[0]修改了列表的第一个数据,给它赋值字符串"Jessica"。
第5行输出了列表friendName。
friendName = ["Kevin", "Tony", "Asum"]
print(friendName)
print(friendName[0])
friendName[0] = "Jessica"
print(friendName)
[0]
中括号加数字,作为索引,用来定位列表中的某个数据。本例中,索引0表示第一个数据。
Jessica
一个字符串,重新给friendName这个列表中的第一个数据赋值。
Debug
我们知道列表和元组有很多相似点,但列表的修改不能应用于元组中,元组具有不可变的特性。元组的内容定义完成后,里面的内容就不能修改。
由于,元组是不可修改的,强行修改会出现以下 bug:
类型错误:
当对元组进行修改时,就会提示元组类型数据更改(TypeError: 'tuple' object does not support item assignment)。
元组和列表的区别
学习以上知识点后,我们需要对元组和列表进行区分:
相同点:
1. 可以使用索引定位到某个元素;
2. 可以使用切片取一个片段;
3. 可以存储不同的数据,如,字符串、整型、浮点型、布尔数等。
不同点:元组内容是不可修改的。
例如:程序员在编写程序时,也会犯错,因此像元组这样不可变的数据结构可以有效防止写代码的人因为自己的错误,误修改了里面的数据。