首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python 有序字典实现

最近在看 requests 源码的时候看到作者使用了 urllib3 中自己实现的OrderedDict类,收获颇多。...如果要我自己实现的话,自己会想到用一个有序存储的对象(如列表)去 hack 内部的实现,但这样有几个缺点: 列表的插入、删除操作性能不如字典,复杂度是 O(N) 量级的。...来看看大神是怎么实现的吧。...创建一个新结点,它的上结点和下结点分别设为last和root,结点的值为字典的键。 将last的下结点和root的上结点指向该结点。 将结点加入__map并加入字典。...实现了这三个方法,剩下的就好办了,__iter__只需从头开始遍历链表并取出键值就可以了。 总结 实现有序字典的关键在于选取一个合适的数据结构来存储顺序信息,这里作者使用了双向链表,然后把结点哈希。

1.3K10
您找到你想要的搜索结果了吗?
是的
没有找到

python有序字典

最近的django开发中用到了有序字典,所以研究了一下,以下。 示例: 有序字典和通常字典类似,只是它可以记录元素插入其中的顺序,而一般字典是会以任意的顺序迭代的。 普通字典: ?...由上面的结果可以看出对普通字典进行遍历,输出结果是无序的。 下面是有序字典(需要导入collections包): ? 对比两种输出结果,不难发现,有序字典可以按字典中元素的插入顺序来输出。...上面两个例子之所以字典中插入元素,而不是一开始就将字典中的元素定义好,是因为有序字典的作用只是记住元素插入顺序并按顺序输出。...如果有序字典中的元素一开始就定义好了,后面没有插入元素这一动作,那么遍历有序字典,其输出结果为空,因为缺少了有序插入这一条件,所以此时有序字典就失去了作用,所以有序字典一般用于动态添加并需要按添加顺序输出的时候

42230

具有列表功能的有序字典实现 ListOrderedDict

字典和列表都是python中常用的数据结构,各自有各自的优点,但有没有可以结合他们优点的数据结构呢,本文初步实现了具有列表功能的有序字典, 取名 ListOrderedDict。...背景 在python编程中,遇到了字典需要有序的情况,可以使用 collections 库中的 OrderedDict,在保持字典功能的同时使得其元素保持输入顺序; 但在此基础上又需要他拥有列表的性质:...按序号索引 切片提取数据 append 和 pop 操作 这就得自己开发了 ListOrderedDict 实现 class ListOrderedDict(OrderedDict): def...is_integer(key): key = list(self.keys())[key] return super().setdefault(key, default) 初步实现...按整数下标提取元素 切片 append pop 其他有序字典操作 使用 功能集成在了我的常用库 mtutils 中,可以pip直接安装 pip install mtutils 之后直接引用 from

84420

Python之有序字典(OrderedDict)与 普通字典(dict)

:无序字典有序字典 两种类型 1.无序字典(普通字典) my_dict = dict() my_dict["name"] = "test" my_dict["age"] = 27 my_dict...注意: Python3.6 改写了 dict 的内部算法,Python3.6 版本以后的 dict 是有序的,所以也就无须再关注 dict 顺序性的问题 2.有序字典 import collections...注意: 有序字典的作用只是记住元素插入顺序并按顺序输出。...如果有序字典中的元素一开始就定义好了,后面没有插入元素这一动作,那么遍历有序字典,其输出结果仍然是无序的,因为缺少了有序插入这一条件,所以此时有序字典就失去了作用,所以有序字典一般用于动态添加并需要按添加顺序输出的时候...,没有存在按序添加的操作,所以有序字典是没有记录插入字段的顺序,最后遍历时,得到数据的顺序仍然是无序的。

2.7K80

【数据结构】实现字典API:有序数组和无序链表

有序数组 无序链表 (二叉树的实现方案将在下一篇文章介绍) 【注意】 为了让代码尽可能简单, 我将字典的Key和Value的值也设置为int类型,而不是对象, 所以在下面代码中, 处理“操作失败”的情况的时候...有序数组实现字典思路 字典,有最关键的两个类型的值: Key和Value。...【注意】这里的“数组长度固定不变”是相对而言的, 下面我会介绍当字典满溢时扩建数组的操作(resize) 选择有序数组的原因 要实现字典, 使用有序数组和无序数组当然都可以, 让我们思考下: 为什么要选择有序数组呢...有序数组相对于无序数组的性能优势 在实现上,无序数组和有序数组的性能差异, 本质上是顺序查找和二分查找的性能差异。...因为二分查找是基于有序数组的,所以 选择无序数组实现字典, 也就意味着选择了顺序查找。 而选择有序数组实现字典, 代表着你可以选择二分查找(或插值查找等), 并享受查找性能上的巨大提升。

1.2K50

python3.7的字典有序

python3.7的字典有序的 旧结构 python3.7之前的字典结构,经典粗暴的hash表实现方式,这样的话每次hash表的扩容和缩容都可能导致hash值的改变。...hash表容量更新的前后,它的键之间的相对顺序是会变化的,因此字典的元素是无序的。.... --------------------- 新结构由 Indices(索引,数组实现) 和 Entries(实体,PyDictObject类型) 两种结构组成。...这种方法,字典 增删改查的时间复杂度 会有以前的O(1) 变为O(2),因为多了一步查找的过程。而且字典扩容和缩容时要按照Indices的顺序来保持字典始终有序。 但是至少有两个优化。...字典占用的内存变小了。旧的字典总会预留大于 1/3的容量的hash位置,防止hash碰撞过多影响效率。现在则不必预留。 字典有序了。

57010

Python面向对象6:​isinstance、super、有序字典

(Foo): deff1(self): print('before') super(myfoo,self).f1() print('after') 3)index文件不做任何修改,执行结果 3、设置有序字典...classmydict(dict):#继承字典的类,字典是无序的 def__init__(self): self.li=[] super(mydict,self)....__setitem__(key,value)#执行父类dict的setitem方法,设置字典或新增字典值 def__str__(self):#mydict自己的str方法 temp_list=[]#设置一个空字典...,用于存放字典为列表 forkeyinself.li: value=self.get(key) temp_list.append("%s:%s"%(key,value)) temp_str="字典拼接后...getitem,有等号的时候执行setitem obj['k2']=456 print(obj)#会执行mydict类中的str方法,如果mydict无str方法,则执行dic的str方法 执行结果:字典显示顺序永远不会变

60180

为什么 Python3.6 之后字典有序

字典的本质就是 hash 表,hash 表就是通过 key 找到其 value ,平均情况下你只需要花费 O(1) 的时间复杂度即可以完成对一个元素的查找,字典是否有序,并不是指字典能否按照键或者值进行排序...print(key,value) ... money 80 girl Tailand age 26 hourse None name lowman 而一个有序字典的输出是这样的: name lowman...age 26 girl Tailand money 80 hourse None 那为什么 Python3.6 之后,Python 的字典有序了呢?...,这也是为什么 Python3.6 以后的版本字典对象是有序的原因。...最后 如果你对 Python 解释器的实现感兴趣,可以阅读 CPython 的源码,源码之下无秘密,阅读源码也是提升自己最快的学习方式,这里推荐一个学习 CPython 的开源仓库 CPython-Internals

1.2K30

为什么Python 3.7以后字典有序并且效率更高?

在Python 3.5(含)以前,字典是不能保证顺序的,键值对A先插入字典,键值对B后插入字典,但是当你打印字典的Keys列表时,你会发现B可能在A的前面。...不仅如此,从Python 3.6开始,下面的三种遍历操作,效率要高于Python 3.5之前: for key in 字典 for value in 字典.values() for key, value...in 字典.items() 从Python 3.6开始,字典占用内存空间的大小,视字典里面键值对的个数,只有原来的30%~95%。...Python 3.6到底对字典做了什么优化呢?为了说明这个问题,我们需要先来说一说,在Python 3.5(含)之前,字典的底层原理。...在Python 3.6以后,字典的底层数据结构发生了变化,现在当你初始化一个空的字典以后,它在底层是这样的: my_dict = {} ''' 此时的内存示意图 indices = [None, None

3.1K41

Python中的字典到底是有序的吗

之前写了文章介绍python中的列表和字典,在文章中描述到了python中的列表是有序的,字典是无序的,后来有粉丝在群里提醒我,说python3.6的版本之后,字典有序的,因此,我找了一个低版本的...python来验证一下效果: 首先,从官网下载python3.4的版本,然后编写一行代码验证一下打印字典的所有key。...查看打印出来的key的顺序: Python3.6以下版本:(以3.4版本为例) 你该不会以为只有使用keys()函数是无序的吧: 从上图可以看出,分别在cmd窗口和pycharm中打印字典的key...接下来再看下python3.6以上版本的效果:(以3.9版本为例) 从上图可以看出,在新的版本中,python针对key的存储已经变为有序,在遍历和打印的时候,会按照存储的顺序进行取值。...再补充一点:之前介绍到,在字典中,key是唯一的。这里并不是说写了不唯一的key就会报错,只是会用后面的key和value去覆盖前面的key和value。

1.7K20

redis 字典实现

作者:张鹏 最近研究了一下redis里面字典实现,redis作为高效的内存存储而被广泛使用,内部实现的db结构以及多种高效的数据结构,其底层基本上就是靠字典实现。...而其字典数据结构是基于哈希表来实现的,其中一些特性的实现十分精妙。...: 2.特性介绍 redis的字典实现了很多特别的东西,花式造轮子的根本原因还是从时间与空间上做考量。...迭代器 redis里面的字典实现了两种迭代器,一种是安全的迭代器,一种是普通的迭代器。所谓安全就是指在迭代的过程中可以执行添加查找等操作,非安全的迭代器就是只能执行迭代操作。...总结 redis字典实现有很多有趣的特性,包括动态扩容缩容,渐进式rehash等,所有这些特性的出发点都是基于充分使用内存的角度去考虑。

1.3K00
领券