python课程及编码字典_python实现有序字典的详细介绍(附代码)

本文介绍了一个用Python实现的有序字典类,通过双向链表记录键值插入顺序,并使用键和链表节点映射来快速定位及删除键值。文章提供了完整的代码实现,有助于读者深入理解有序字典的工作原理。

本篇文章给大家带来的内容是关于python实现有序字典的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

对于一个能够保存键值插入顺序的字典,是如何实现的?

主要有两点:

一个双向链表,用来记录字典的键值的插入顺序

一个键和链表节点的映射,主要用来删除键的时候,找到键对应的节点

python代码实现class Link:

__slots__ = 'prev', 'next', 'key'

class OrderDict:

def __init__(self):

self.root = Link()

self.map = {}

self._node_map = {}

self.root.next = self.root

self.root.prev = self.root

def __setitem__(self, key, value):

if key in self._node_map:

self.map[key] = value

else:

root = self.root

last = root.prev

link = Link()

link.prev, link.next, link.key = last, root, key

last.next = link

root.prev = link

self._node_map[key] = link

self.map[key] = value

def __getitem__(self, item):

return self.map[item]

def __delitem__(self, key):

del self.map[key]

link = self._node_map.pop(key)

link_prev, link_next = link.prev, link.next

link_prev.next, link_next.prev = link_next, link_prev

link.prev, link.next = None, None

def pop(self):

"""

LIFO

:return:

"""

if not self._node_map:

raise KeyError('dict is empty')

root = self.root

link = root.prev

link_prev = link.prev

link_prev.next = root

root.prev = link_prev

link.prev, link.next = None, None

self._node_map.pop(link.key)

return self.map.pop(link.key)

def __iter__(self):

root = self.root

curr = root.next

while curr != root:

yield curr.key

curr = curr.next

def values(self):

root = self.root

curr = root.next

while curr != root:

yield self.map[curr.key]

curr = curr.next

def __str__(self):

root = self.root

curr = root.next

out = []

while curr != root:

out.append((curr.key, self.map[curr.key]))

curr = curr.next

return str(out)

if __name__ == '__main__':

d = OrderDict()

d['a'] = '1'

d['b'] = '2'

d['c'] = 'c'

print(d)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值