【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 中元素进行增删查改的方法。

  1. 利用 insert()和分片将元素添加到指定位置 , 利用 remove() 和关键字 del 对
    元素进行删除
    需要注意分片 [a:b] 中的位置不包含位置 b,利用 [a,a] 可以将元素添加至 a 位置

   

   

  1. 利用正反索引对元素进行查找

  2. 对元素修改可以直接赋值替换

  3. 列表中还有其他方法如 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

  1. 元组可以理解为一个固定的列表,一旦初始化其中的元素便不可修改(认真理解这句话),只能对元素进行查询
>>> 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 便是不可变对象。

  1. 元组是固定的列表,那么元组的意义何在呢?
    因为 tuple 不可变,所以代码更安全。如果可能,能用 tuple 代替 list 就尽量用 tuple
    并且需要注意元组中元素的可变性!!

  2. 空的 tuple 可以记为 (),若只有一个元素的 tuple 记为 (1,)
    因为记为 (1) 的话,这个实际代表的是数字 1,此时 () 是数学公式中的小括号

  3. 因为元组是固定的列表,所以其内置的大多数的方法和列表是差不多的。

  4. 可以通过 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 的增删查改

  1. 可以采用“键值对”的方法和 update() 方法向字典中添加元素
    删除可以使用关键字 del 以及 pop() 方法

   

  1. 查询采用如查询列表元素的索引方式,使用键作为索引查找值
    若元素不存在会报错,在进行查找前,可以通过以下两种方法判断 key 是否存在:
    ① 成员资格运算符 --in 运算符
    ② get() 方法(值不存在时返回 NULL, 也可指定返回的值)
>>> test={'Mon':1}
>>> 'Fri' in test
False
>>> test.get('Fri')
>>> test.get('Fri',-1)
-1
  1. 对值得修改可以采用直接覆盖原值的方法

  2. 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}