python实现有序字典

野性酷女 2021-12-21 23:59 370阅读 0赞

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

主要有两点:

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

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

python代码实现

  1. class Link:
  2. __slots__ = 'prev', 'next', 'key'
  3. class OrderDict:
  4. def __init__(self):
  5. self.root = Link()
  6. self.map = {}
  7. self._node_map = {}
  8. self.root.next = self.root
  9. self.root.prev = self.root
  10. def __setitem__(self, key, value):
  11. if key in self._node_map:
  12. self.map[key] = value
  13. else:
  14. root = self.root
  15. last = root.prev
  16. link = Link()
  17. link.prev, link.next, link.key = last, root, key
  18. last.next = link
  19. root.prev = link
  20. self._node_map[key] = link
  21. self.map[key] = value
  22. def __getitem__(self, item):
  23. return self.map[item]
  24. def __delitem__(self, key):
  25. del self.map[key]
  26. link = self._node_map.pop(key)
  27. link_prev, link_next = link.prev, link.next
  28. link_prev.next, link_next.prev = link_next, link_prev
  29. link.prev, link.next = None, None
  30. def pop(self):
  31. """
  32. LIFO
  33. :return:
  34. """
  35. if not self._node_map:
  36. raise KeyError('dict is empty')
  37. root = self.root
  38. link = root.prev
  39. link_prev = link.prev
  40. link_prev.next = root
  41. root.prev = link_prev
  42. link.prev, link.next = None, None
  43. self._node_map.pop(link.key)
  44. return self.map.pop(link.key)
  45. def __iter__(self):
  46. root = self.root
  47. curr = root.next
  48. while curr != root:
  49. yield curr.key
  50. curr = curr.next
  51. def values(self):
  52. root = self.root
  53. curr = root.next
  54. while curr != root:
  55. yield self.map[curr.key]
  56. curr = curr.next
  57. def __str__(self):
  58. root = self.root
  59. curr = root.next
  60. out = []
  61. while curr != root:
  62. out.append((curr.key, self.map[curr.key]))
  63. curr = curr.next
  64. return str(out)
  65. if __name__ == '__main__':
  66. d = OrderDict()
  67. d['a'] = '1'
  68. d['b'] = '2'
  69. d['c'] = 'c'
  70. print(d)

转载于:https://www.cnblogs.com/time-read/p/10696198.html

发表评论

表情:
评论列表 (有 0 条评论,370人围观)

还没有评论,来说两句吧...

相关阅读

    相关 python 有序字典

    首先介绍下为什么有时候用到字典。 例如一场考试成绩其实可以用列表表示,如\[\[张三,89\],\[李四,85\]\]。 可能很多人觉得这样没有字典直观。 确实,但是

    相关 python实现有序字典

    对于一个能够保存键值插入顺序的字典,是如何实现的? 主要有两点:   一个双向链表,用来记录字典的键值的插入顺序   一个键和链表节点的映射,主要用来删除键的时候,找