Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

2.5 数据结构

(一)列表

列表(List)是python语言编程使用最多的一种数据结构。
它是一种有序的集合,可以随时添加和删除其中的元素。

l = [6, 3.2, '苹果']

列表是一个可变的有序表,所以,可以往列表中追加元素到末尾:

l.append('香蕉')
l
[6, 3.2, '苹果', '香蕉']

要删除指定位置的元素,用pop(i)方法,其中i是索引位置:

l.pop(1)
l
[6, '苹果', '香蕉']

要把某个元素替换成别的元素,可以直接赋值给对应的索引位置:

l[1] = 1.9
l
[6, 1.9, '香蕉']

列表中的元素的索引位置是从0开始,直到列表的长度-1结束。

列表元素也可以是另一个列表,比如:

l = [6, 1.9, ['苹果', '香蕉']]  #这种称之为嵌套
len(l)
3

如果一个列表中一个元素也没有,就是一个空的列表,它的长度为0:

l = []
len(l)
0

列表的常用方法

列表支持以下方法:

语法描述
L.append(x)将元素x追加到列表L的尾部
L.count(x)返回元素x在列表L中出现的次数
L.extend(m)将列表m的项追加到L的结尾处,操作符+=完成同样的功能
L.index(x, start, end)返回元素x在列表L中(或L的start:end分片中)最左边出现的索引位置,否则会产生一个ValueError异常
L.insert(i, x)在索引位置i处将元素x插入列表L
L.pop()返回并移除list L最右边的元素
L.pop(i)返回并移除L中索引位置int i处的元素
L.remove(x)从list L中移除最左边出现的元素x,如果找不到x就产生ValueError异常

练习:append()方法

  1. 创建一个列表包含元素:‘100’和’hoffman’, 然后在列表后面追加一个新元素70。

  2. 计算上述列表的长度



练习:创建一个列表

  • 请创建一个列表变量,名字叫college,包含以下元素:“外语学院”,“国际交流学院”,“教育学院”,“传媒学院”

  • 使用print语句输出上述列表

  • 使用append语句在该列表后追加一个新的元素:“商学院”

提示:在调试代码过程中,如果出现语句错误,如“SyntaxError: invalid character in identifier”,讲中文逗号",“改成英文逗号”," 。



(二)元祖

另一种有序列表叫元组:tuple。

这个单词怎么读呢? Python之父吉多·范罗苏姆在 Twitter 上说:“ 每周的一三五我会把 tuple 念作 too-pull,而二四六我喜欢念作 tub-pull。至于礼拜天嘛,我从不会讨论这些。:)”

引自《Python语言及其应用》

元祖和列表非常类似,但是tuple一旦初始化就不能修改,比如:

>>> t = (6, 1.9,  '香蕉')
>>> type(t) # 看看它的类型

现在,这个元祖不能变了,它也没有append(),insert()这样的方法。其他获取元素的方法和列表是一样的,你可以正常地使用t[0]train[-1],但不能赋值成另外的元素。 通常我们使用元祖来存储一些无法被修改的安全信息。

练习: 元祖的不变特性

创建一个元祖变量名称为account_info, 其中包含两个元素’John’, ‘123456’,
然后尝试令account_info[1] = ‘654321’。



(三)字典

我们要学习的第三个数据结构是字典(dict)全称dictionary。它是Python中唯一的映射类型的数据结构。

举个例子,假设要根据同学的名字查找对应的成绩,如果用列表实现,需要两个列表:

names = ['Michael', 'Bob', 'Tracy']
scores = [95, 75, 85]

给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,列表越长,耗时越长。

如果用字典实现,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。用Python写一个字典如下:

>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95

请务必注意,字典内部存放的顺序和键放入的顺序是没有关系的。

和列表比较,字典有以下几个特点:

  1. 查找和插入的速度极快,不会随着key的增加而变慢;

  2. 需要占用大量的内存,内存浪费多。

而列表相反:

  1. 查找和插入的时间随着元素的增加而增加;

  2. 占用空间小,浪费内存很少。

所以,字典是用空间来换取时间的一种方法。

字典可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用字典非常重要,需要牢记的第一条就是字典的key必须是不可变对象

字典有如下方法:

语法描述
d.keys()返回字典d中所有键的视图
d.values()返回字典d中所有值的视图
d.items()返回字典d中所有(key, value)对的视图
d.get(k)返回键k相关联的值,如果k不在字典d中就返回None
d.get(k, v)返回键k相关联的值,如果k不在字典d中就返回v
d.pop(k)返回键k相关联的值,并移除键为k的项,如果k不包含在d中就产生KeyError异常
d.pop(k, v)返回键k相关联的值,并移除键为k的项,如果k不包含在d中就返回v
d.popitem()返回并移除字典d中一个任意的(key, value)对,如果d为空就产 生KeyError异常
d.clear()从字典d中移除所有项
d.fromkeys(s, v)返回一个dict,该字典的键为序列s中的项,值为None或v(如果给定 了参数v)
d.setdefault(k, v)与dict.get()方法一样,不同之处在于,如果k没有包含在字典d中 就插入一个键为k的新项,其值为None或v(如果给定了参数v)
d.update(a)将a中每个尚未包含在字典d中的(key, value)对添加到d,对同时 包含在d与a中的每个键,使用a中对应的值替换d中对应的值——a可以是 字典,也可以是(key, value)对的一个iterable,或关键字参数

练习:创建字典

创建一个字典变量,名为student_info, 包含三个键-值对:

  • ‘name’: ‘John’

  • ‘age’: 21

  • ‘major’:‘math’




练习:创建一个字典

  • 使用字典创建一个变量,变量名为account_info,包含账户名:“user_01”,和密码"123456",然后打印变量。

  • 给上面这个字典变量,添加一个新的键-值对,键为“user_02”,值为“654321”。