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()方法¶
创建一个列表包含元素:‘100’和’hoffman’, 然后在列表后面追加一个新元素70。
计算上述列表的长度
练习:创建一个列表¶
请创建一个列表变量,名字叫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请务必注意,字典内部存放的顺序和键放入的顺序是没有关系的。
和列表比较,字典有以下几个特点:
查找和插入的速度极快,不会随着key的增加而变慢;
需要占用大量的内存,内存浪费多。
而列表相反:
查找和插入的时间随着元素的增加而增加;
占用空间小,浪费内存很少。
所以,字典是用空间来换取时间的一种方法。
字典可以用在需要高速查找的很多地方,在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,或关键字参数 |
练习:创建一个字典¶
使用字典创建一个变量,变量名为account_info,包含账户名:“user_01”,和密码"123456",然后打印变量。
给上面这个字典变量,添加一个新的键-值对,键为“user_02”,值为“654321”。