07 数据结构
本章内容:
1、type命令
2、序列
3、元组
4、列表
5、列表函数
6、列表排序
7、列表解析
8、字典
9、集合(set)
------------------------------
python中主要的数据结构就是列表和字典。这节中,我们主要介绍值集合以及常用的函数;
1、type命令
查看数据的数据类型;
在使用数据集合的时候,我们有时候需要知道数据集合中某个元素的数据类型,此时,就会使用到type命令;
2、序列
序列就是一组安装顺序排列的值:
a\第一个正索引为0,指的是最左端
b\第一个负索引为-1,指的是最右端
c\可以使用切片来赋值子序列;例如seq[begin:end];
d\可以使用 + 和 * 进行合并;序列的类型必须相同,及不能拼接 元组合列表;
e\len可以用来计算序列的长度 len(s);
f\表达式 x in s 检查序列 s 是否包含元素 x。 换句话说,如果 s 包含元素 x 则返回值 True 否则返回 False。
字符串和列表是最常用的序列;元组有独特的用途;
3、元组
元组是一种不可变的序列。包含0个或者更多个值。它可以包含任意的Python值,甚至可以包含其他元组。
items中包含多个元组,索引可以多重指定;
有逗号,就表示元组,如果没有,则表示整型;(5,)
元组的特点:它是不可变的!!!不能进行修改;
但是,我们可以通过重新定义变量的方式,来存放元组对应的数据,达到改变元组元素的目的;例如上图--删除元组第一个数据;
常见的元组函数:
x in tup 如果x是元组tup的一个元素,则返回True,否则返回False
len(tup) 元组tup包含的元素数
tup.count(x) 元素x在元组tup中的出现的次数
tup.index(x) 元组tup中第一个元素x的索引;如果x未包含在元组tup中,将引发ValueError异常
例如:
与字符串一样,可以通过加减号来凭借元组:
4、列表
列表与元组基本相同,但是列表可变,我们可以添加、删除、修改列表元素;
一般列表使用方括号括起来;与字符串和元组一样,可以使用len(s)函数,+ * 来拼接列表;
另外,与字符串和元组一样,你可以使用索引和切片来访问元素和子列表;
注意:列表可以包含任意的类型值,包括数字、字符以及列表;空列表为[];
列表是可变的;
修改列表的值,如下图:
列表如果引用自己,作为列表中的一个值,则使用[...]来表示,而不是愚蠢的把自己的值重复赋予到列表中来;
5、列表函数
常见的列表相关的函数,如下:
s.append(x) 在列表的 s 的末尾添加元素 x
s.count(x) 返回元素 x 在列表 s 中出现的次数
s.extend(lst) 将lst的所有元素都添加到列表 s 末尾
s.index(x) 返回第一个 x 元素的索引
s.insert(i,x) 将元素 x 插入到索引 i 指定的元素前面,结果是 s[i] == x
s.pop(i) 删除并返回s 中索引为 i 的元素
s.remove(x) 删除s 中的排列顺序
s.reverse() 反转 s 中的元素的排列顺序
s.sort() 将s 的元素按升序排列
下面的代码:根据传入的数字列表创建一个消息列表;
# numoute.py def numnote(lst): msg = [] for num in lst: if num < 0: s = str(num) + ' is negative' elif 0 <= num <= 9: s = str(num) + ' is a digit' msg.append(s) return msg
运行结果如下:
要答应消息,让每条消息占据一行,就可以使用 for 循环来实现;
函数extend 类似于 append,但在末尾添加一个序列,如下图:
函数pop删除并返回给定索引对应的元素,如下所示:
函数remove(x)删除列表中的第一个x元素,但不返回该元素:
函数reverse翻转列表的元素排序顺序:
6、列表排序
排序对于数据存储来说非常重要,我们早查找数据的时候如果数据是有序的,则会大大提高数据查找的速率;
sort() 函数,则是Python中实现排序的函数;
sort()函数,是默认升序,如果需要反向排序,则使用reverser()函数来实现:
包含元素的列表如何排序呢?
由上图可知,元组的排序是先看第一个元素,如果第一个元素相同就看第二个元素;
7、列表解析
列表的一种特殊表示方法--列表解析;如下图:
这种表示法的主要优点就是间接易读。下面的代码就是没有做解析时使用的;
result = [] for n in range(1,11) result.append(n * n)
示例:
将列表中的每个数字翻倍并加上7:
包含前10个自然数的立方:
同时,也可以再列表解析中使用字符串:
列表解析的一种常见用途是,以某种方式修改现有列表,如下:
列表解析进行筛选;
例如:下图的列表解析返回一个列表,该列表只包含列表nums中的正数:
下面的代码与上述代码等价;
下面函数使用列表解析删除字符串中的所有元音:
# eatvowels.py def eat_vowels(s): """ Removes the vowels from s. """ return ''.join([c for c in s if c.lower() not in 'aeiou'])
运行结果如下:
[c for c in s if c.lower() not in 'aeiou'] 表示:
这是一个筛选列表解析,它以每次一个字符的方式扫描s,将每个字符转换为小写,再检查它是不是元音。如果是元音,则不将其加入最终的列表,否则将其加入最终列表;
该列表解析的结果是一个字符串列表,因此我们使用join将所有字符串拼接成一个,再返回这个字符串。
8、字典
在存储键 - 值对方面,Python字典是一种效率极高的结构。例如:
‘red’ 为键,而后面 1 则为值;访问字典的数据:
使用键来访问字典值是一种效率极高的方式,即便字典包含几千个数据;
同时,字典与列表一样,可以修改、添加、删除 键-值 对。例如:
对字典键有两个限制:1、字典中的键必须独一无二;2、键必须是不可变,因此,字典键不能是列表,也不能是字典。
关于字典的所有函数:
d.items() 返回一个由字典d的键 - 值 对组成的视图(view)
d.keys() 返回一个字典d的键组成的视图
d.values() 返回一个由字典d的值组成的视图
d.get(key) 返回与key相关联的值
d.pop(key) 删除键key并返回与之相关联的值
d.popitem() 删除字典d中的某个键 - 值对并返回相应的键 - 值
d.clear() 删除字典d的所有元素
d.copy() 复制字典d
d.fromkeys(s,t) 创建一个字典,其中的键来自s,值来自t
d.setdefault(key,v) 如果键key包含在字典d中,则返回其值;否则,返回v并将(key,v)添加到字典d中
d.update(e) 将e的键 - 值对添加到字典d中;e可能是字典,也肯能是键 - 值对序列
例子如下:
9、集合(set)
集合是一系列不重复的元素。集合类似于字典,但只包含键,而没有相关联的值。
集合分两类:可变集合和不可变集合。对于可变集合,可以修改、添加、删除元素;而不可变的集合则一旦创建,就不能修改;
集合可以用来删除重复项,如下图:
要获取集合的支持的函数,可以通过dir(set)来查看,这里就不再多说;