【Python】Python中的数据结构
Python 中的数据结构
这里总结一下 Python 中的内置数据结构(Built-in Data Structure): 列表 list、元组 tuple、字典 dict、集合 set,涵盖的仅有部分重点,详细地去介绍每个知识点并未涉及。
列表 list
list 的显著特征
-
列表中的每个元素都可变的
意味着可以对每个元素进行修改和删除 -
列表是有序的,每个元素的位置是确定的,可以用索引去访问每个元素
-
列表中的元素可以是Python 中的任何对象
可以为任意对象就意味着元素可以是字符串、整数、元组、也可以是 list 等 Python 中的对象。
>>> x = [1,2,3]
>>> y = {'name':'Sakura'}
>>> z="Test"
>>> a=[x,y,z]
>>> a
[[1, 2, 3], {'name': 'Sakura'}, 'Test']
觉得 Python 中的 list 和 C 语言中的数组蛮像的,只是 list 中的元素类型可以为 Python 中的任意对象,C 中的数组只能是同种类型。当访问他们中的元素时,都可采用索引。这里需要注意的是,list 不仅可以向数组那样正向索引也可以反向索引。
list 中的正反索引
list 中的增删查改
list 中有很多的方法,这里仅介绍对 list 中元素进行增删查改的方法。
- 利用 insert()和分片将元素添加到指定位置 , 利用 remove() 和关键字 del 对
元素进行删除
需要注意分片 [a:b] 中的位置不包含位置 b,利用 [a,a] 可以将元素添加至 a 位置
-
利用正反索引对元素进行查找
-
对元素修改可以直接赋值替换
-
列表中还有其他方法如 pop()删除末尾元素,pop(i) 删除指定位置 i 的元素,append() 向末尾添加元素
list 函数
可以通过 list 将序列创建为列表
Python 中包含 6 中內建的序列:列表,元组,字符串、Unicode 字符串、buffer 对象和 xrange 对象。
>>> list("Hello,world")
['H', 'e', 'l', 'l', 'o', ',', 'w', 'o', 'r', 'l', 'd']
其实 list 为一种类型并非函数,但此处二者并无多大区别。下面的 tuple、dict 都如此。
元组 tuple
- 元组可以理解为一个固定的列表,一旦初始化其中的元素便不可修改(认真理解这句话),只能对元素进行查询
>>> test=(1,2,3)
>>> test
(1, 2, 3)
>>> test[1]=4
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> test[1:1] = 4
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> test[1]
2
从上可知,tuple 不支持对元素的修改(包括删除),tuple 一初始化便固定下来了。
再来看一个例子。
>>> test=('a','b',['A','B'])
>>> print(test)
('a', 'b', ['A', 'B'])
>>> test[2][0]='x'
>>> test[2][1]='y'
>>> test
('a', 'b', ['x', 'y'])
这里看似元素中的元素改变了,可是仔细分析下,元组中的第三个元素是一个列表。
代码 3.4 行改变的是列表中的值,元组所指的这个元素列表并没有改变,需要注意这点!
这就涉及到 Python 中的可变对象和不可变对象,像 list 这样的就是可变对象,tuple 便是不可变对象。
-
元组是固定的列表,那么元组的意义何在呢?
因为 tuple 不可变,所以代码更安全。如果可能,能用 tuple 代替 list 就尽量用 tuple
并且需要注意元组中元素的可变性!! -
空的 tuple 可以记为 (),若只有一个元素的 tuple 记为 (1,)
因为记为 (1) 的话,这个实际代表的是数字 1,此时 () 是数学公式中的小括号 -
因为元组是固定的列表,所以其内置的大多数的方法和列表是差不多的。
-
可以通过 tuple 将序列转换为元组,用法和 list 一样
>>> tuple('Hello,world!')
('H', 'e', 'l', 'l', 'o', ',', 'w', 'o', 'r', 'l', 'd', '!')
字典 dict
字典这个概念就是基于现实生活中的字典原型,生活中的使用名称 - 内容对数据进行构建,Python 中使用键 (key)- 值(value) 存储,也就是 C++ 中的 map。
dict 的显著特征
-
字典中的数据必须以键值对的形式出现
-
键不可重复,值可重复
键若重复字典中只会记该键对应的最后一个值 -
字典中键 (key) 是不可变的,为不可变对象,不能进行修改;而值 (value) 是可以修改的,可以是任何对象。
在 dict 中是根据 key 来计算 value 的存储位置,如果每次计算相同的 key 得出的结果不同,那 dict 内部就完全混乱了。
dict 的增删查改
- 可以采用“键值对”的方法和 update() 方法向字典中添加元素
删除可以使用关键字 del 以及 pop() 方法
- 查询采用如查询列表元素的索引方式,使用键作为索引查找值
若元素不存在会报错,在进行查找前,可以通过以下两种方法判断 key 是否存在:
① 成员资格运算符 --in 运算符
② get() 方法(值不存在时返回 NULL, 也可指定返回的值)
>>> test={'Mon':1}
>>> 'Fri' in test
False
>>> test.get('Fri')
>>> test.get('Fri',-1)
-1
-
对值得修改可以采用直接覆盖原值的方法
-
dict 中的元素是无序的,不可以采用分片。
dict 函数
可以使用 dict,通过其他映射或者(键,值)对的序列建立字典。
>>> test=[('name','Sakura'),('age',20)]
>>> d = dict(test)
>>> d
{'name': 'Sakura', 'age': 20}
dict 也可以使用关键字参数创建字典,也可用映射作为 dict 参数,dict 若不带任何参数,将返回一个空字典
>>> d = dict(name='Sakura',age=20)
>>> d
{'name': 'Sakura', 'age': 20}
>>> a=dict()
>>> a
{}
集合 set
集合更接近数学上集合的概念。集合中每个元素都是无序的、不重复的任意对象。
可以通过集合去判断数据的从属关系,也可以通过集合把数据结构中重复的元素减掉。集合可做集合运算,可添加和删除元素。
集合的创建
创建集合时需要用 list 作为输入集合,可通过 add()方法增加元素,remove() 方法删除元素
>>> test=set([1,2,3])
>>> test
{1, 2, 3}
>>> test.add(3)
>>> test
{1, 2, 3}
>>> test.add(6)
>>> test
{1, 2, 3, 6}
>>> test.remove(3)
>>> test
{1, 2, 6}
集合中重复的元素会被过滤掉
集合运算
Python 中的集合也可以进行集合的之间的交、并等运算
>>> s1 = set([1,2])
>>> s2=set([2,3])
>>> s1 & s2 # s1 与 s2
{2}
>>> s1 | s2 # s1 与 s2 进行或运算
{1, 2, 3}