python dict怎么实现的
作者&投稿:荀飘 (若有异议请与网页底部的电邮联系)
Python就是用c实现的,你说可以不可以?另外,c实现的这种哈希表+链表的二维数据结构,其实也有实例:memcached中的缓存就是同一种数据结构。只不过,在python里面,链表用于维持有序性(foreach/push/pop的时候用到),而mc中,链表则用于淘汰算法LRU。
dir(dict) #这会列出dict的所有成员函数help(dict.xxx) #这会给出dict的成员函数xxx的帮助文档
Python中dict对象是表明了其是一个原始的Python数据类型,按照键值对的方式存储,其中文名字翻译为字典,顾名思义其通过键名查找对应的值会有很高的效率,时间复杂度在常数级别O(1).dict底层实现(推荐学习:Python视频教程)在Python2中,dict的底层是依靠哈希表(Hash Table)进行实现的,使用开放地址法解决冲突.
所以其查找的时间复杂度会是O(1).
Dict的操作实现原理(包括插入、删除、以及缓冲池等)
首先介绍:PyDictObject对象的元素搜索策略:
有两种搜索策略,分别是lookdict和lookdict_string,lookdict_string就是lookdict在对于PyStringObject进行搜索时的特殊形式,那么通用的搜索策略lookdict的主要逻辑是:
(1)对第一个entry的查找:
a)根据hash值获得entry的索引
b)若entry处于unused态,则搜索结束;若entry所指向的key与搜索的key相同,则搜索成功
c)若当前entry处于dummy态,则设置freeslot(这里的freeslot是可以返回作为下一个立即可用的地址来存储entry)
d)检查Active态的entry,若其key所指向的值与搜索的值相同,则搜索成功
(2)对剩余的探测链中的元素的遍历查找:
a)根据所采用的探测函数,获得探测链上的下一个待检查的entry
b)检查到一个unused态的entry,表明搜索失败:
如果freeslot不为空,则返回freeslot;否则返回unused态的entry
c)检查entry的key与所搜索的key的引用是否相同,相同则搜索成功,返回entry
d)检查entry的key与所搜索的key的值是否相同,相同则搜索成功,返回entry
e)遍历过程中,发现dummy态的entry,且freeslot未设置,则设置freeslot
接下来是:PyDictObject对象的元素插入与删除的策略:
需要首先用到搜索策略,搜索成功,则直接将值进行替换,搜索失败,返回unused态或dummy态的entry,设置key、value和hash值,并且根据目前插入的元素情况进行ma_table的大小的调整(调整的依据就是装载率,根据是否大于2/3来进行调整);删除也是类似,先计算hash值,然后搜索相应的entry,搜索成功,删除entry中维护的元素,将entry从Active态修改为dummy态
在PyDictObject的实现过程中,会用到缓冲池,在PyDictObject对象被销毁的时候,才开始接纳被缓冲的PyDictObject对象,定义的缓冲池可接纳的对象数量是80个,创建新PyDictObject对象的时候,如果缓冲池中有,则可以直接从缓冲池中取出使用
更多Python相关技术文章,请访问Python教程栏目进行学习!以上就是小编分享的关于python dict怎么实现的的详细内容希望对大家有所帮助,更多有关python教程请关注环球青藤其它相关文章!
柴孙六氟: 统计一个列表中每一个元素的个数在Python里有两种实现方式, 第一种是新建一个dict,键是列表中的元素,值是统计的个数,然后遍历list.
中原区18695703481: python 怎么将字符转成dict - ?
柴孙六氟: str_ = '''{'a':1,'b':2}''' print type(str_) str_to_dict = eval(str_)#使用eval 函数 直接转成dict ,同样适用于数组 元组.print type(str_to_dict)
中原区18695703481: python如何将字符串转换成字典dict类型 - ?
柴孙六氟: 用eval()或exec()函数实现: 比如有user = "{'name' : 'jim', 'sex' : 'male', 'age': 18}">>> user"{'name' : 'jim', 'sex' : 'male', 'age': 18}">>> b=eval(user)>>> b {'age': 18, 'name': 'jim', 'sex': 'male'}>>> exec("c="+user)>>> c {'age': 18, 'name': 'jim', 'sex': 'male'}
中原区18695703481: 请问python怎么做到得到的值组成一个dict? - ?
柴孙六氟: v_dict = {1:'lily',2:'mike',3:'tom'} print v_dict[1] print v_dict[2] print v_dict[3] v_dict1 = {'lily':1,'mike:2','tom':3} print v_dict1['lily'] print v_dict1['mike'] print v_dict1['tom']
中原区18695703481: 如何用python从excel中同时提取两个列的数据,并生成dict(用xlrd) - ?
柴孙六氟: import xlrd data = xlrd.open_workbook('excelFile.xls') table = data.sheet_by_index(0) #通过索引顺序获取工作表 colnumber_b = ord('B')-ord('A') colnumber_g = ord('G')-ord('A') score_dict = {} for i in range(100): #前一百行 score_dict[table.cell(i,colnumber_b).value]=table.cell(i,colnumber_g).value
中原区18695703481: Python中字典怎么转化成字符串 - ?
柴孙六氟: InputStream is = null; byte[] buf = new byte[2048]; int len = 0; FileOutputStream fos = null;
中原区18695703481: python的列表转换为字典:list=[(1,2),(3,4),(5,6)]如何能转换成字典dict={2:1,4:3,6:5} - ?
柴孙六氟: list=[(1,2),(3,4),(5,6)]dict = {}for item in list:dict[item[1]] = item[0]print(dict)
中原区18695703481: python3写一段小程序:想要根据输入的名字在dict中查出相应的成绩,应该怎么实现? - ?
柴孙六氟: number里面应该是name还有后面那部分%s不需要
中原区18695703481: Python中的dict怎么用 - ?
柴孙六氟: #字典的添加、删除、修改操作 dict = {"a" : "apple", "b" : "banana", "g" : "grape", "o" : "orange"} dict["w"] = "watermelon" del(dict["a"]) dict["g"] = "grapefruit" print dict.pop("b") print dict dict.clear() print dict#字...
中原区18695703481: python怎么定义多个字典 - ?
柴孙六氟: Python的数据不需要声明, 使用的时候就定义了 mydict = {} mydict2 = {}随用随定义, 不需要纠结这个问题