Python特性四:常见的数据结构

我们熟知的Python数据结构,列表、字典、集合、还有....栈?Python中有栈吗?

不同于Java语言的命名明确,Java中的列表还细分为LinkedList 和ArrayList。Python倾向于简单且人性化的的命名方案,但是要理解Python中的列表类型是以链表实现的还是以动态数组实现的,就有点麻烦。

一.字典(dict)

1.dict-Python内置的字典实现

字典是Python的核心数据结构。字典可以存储任意数量的对象,且每个对象都由唯一字典键标识(我们称字典是由键值对组织而成的),Python中可以括号字典表达法和字典解析式来创建字典:

#创建空字典
d = {}
d =dict()

#定义一个字典
contact = {"Jane":"0318", "jack":"0514","tom":"0752"}

#解析式生成字典
>>>squares= { x: x*x for x in range(1,5)}
>>>squares
>>>{1:1, 2:4, 3:9, 4:16}

官方文档的对字典的解释

字典也通常被称为映射,散列表。可散列对象在具有生命周期中永远不会改变其散列值(__hash__),并且可以与其他对象进行比较(__eq__),相等的可散列对象,其散列值必然相同。字符串和数这种不可变类型的可散列的,可以用来做字典键。

Python的字典在一般情况下,很好的支持查找、更新和删除操作,时间复杂度均为O(1)

2.collections.OrderedDict——记录键的插入顺序

collections.OrderedDict是dict的子类,OrderedDict不是语言内置的,需从标准库中的collections模块导入:

3.collections.defaultdict——为缺失的键返回默认值

同理,defaultdict也是dict的一个子类,其构造函数接受一个可调用对象,查找时如果找不到给定的键,就返回这个可调用对象

二.数组

数组由大小固定的数据记录组成,并且能根据索引快速找到其中的每个记录。

在Python中,跟数组相关的数据结构有:

1.列表——动态数组,可以删除或添加元素,并且还可以包含任意元素

arr = ["one","two",23]
arr[1]
"two"

2.元组——不可变容器,与列表不同的是,Python的元组对象是不可变的,元组中的元素在创建市定义,并且不能修改和删除

3.array.array——基本类型数组

Python中的array模块占用的空间较少,使用array.array类创建的数组市可变的,行为与列表类似。但这种数组是单一数据类型的数组,数据元素必须严格为同一类型(列表的元素类型可以是任意的)

4.str——字符串

实际上,字符串是一种不可变的字符数组,它的每个字符都是长度为1的str对象

三.结构体、数据对象

1.字典——简单的数据对象,Python有内置的创建字典的语法糖,很方便

2.元组——不可变对象集合

3.自定义类——自定义结构体

4collections.namedtuple——数据对象

与普通元组一样,namedtuple是不可变的,它相当于具有名称的元组,作用与每个对象,是这些对象都能通过唯一标识访问,从而无须索引访问。

可以看到,namedtuple和tuple占用相同的内存,但是比普通元组能更好的组织数据,更加易读。

四.集合和多重集合

集合是一种不包含重复元素的无序对象。可用来快速检查元素的包含性,可以添加元素,也可删除。

1.set——Python的内置集合

属于可变类型,能够动态插入和删除元素。set由dict数据类型支持,所有可散列的对象都可以存在集合中。

 

2.frozenset——不可变集合

fronzen的含义就是固定的意思,所以frozenset在构造后无法更改,只能用作查询

3.collections.Counter——多重集合

在Python标准库中collections.Counter类实现了多重集合(也称作包,bag)类型,这种类型允许集合中多次出现同一个元素,适合用于  既需要检查元素是否在集合中,又要同统计出现次数 的情况

五.栈

栈是一组对象的容器,支持后进先出(LIFO)的插入和删除操作。与列表或数组不同,栈通常不允许随机访问对象。在Python中,栈的实现:

1.列表——内置的栈实现

Python的内置列表类型能够实现入栈和出栈操作。但列表在内部是以动态数组实现,在添加或者删除的时候,列表偶尔需要调整元素的存储空间大小。为了获得最佳性能,基于Python列表的栈应该向高索引增长,并向低索引缩小。对应这列表的append()和pop()方法。

2.collections.deque——快速且稳健的栈

deque类实现了一个双端队列,支持O(1)时间从两端添加和移除元素。因为双端队列支持从两端添加和删除元素,所以既可以作为队列也可以作为栈。其底层为双向链表,相较于列表,这种方法实现栈性能更优。

六.队列

队列是一组对象的容器,支持先进先出的,具有出队和入队操作,与列表数组不同,不支持随机访问对象,与栈类似,但是元素的操作不同。

Python中用来实现队列的也可以用上面提到的列表、collections.deque,原理一样

有一个特殊模块queue.Queue,在python中是以同步的方式实现,提供了锁语义来支持多个并发的生产者和消费者。

对于并行计算有些帮助,但也可能会导致阻塞,产生不必要的开销。

7.优先队列

优先队列是一个容器数据结构,可以视为队列的改进版,其中元素不是基于插入时间,而是基于优先级的,例如操作系统调度器的工作往往需要用到。

1.列表——手动维护有序队列

使用有序表能够快速识别和删除最大或最小元素,利用Python的内置sort排序

2.heapq——基于列表的二叉堆

heapq是二叉堆,通常用普通列表实现,能在O(logn)时间内插入和获取最小的元素。heapq模块是在Python中不错的优先级队列实现

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值