python实现有序字典的详细介绍(附代码)


本文摘自php中文网,作者不言,侵删。

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

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

主要有两点:

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

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

python代码实现

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

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)

【相关推荐:python教程】

以上就是python实现有序字典的详细介绍(附代码)的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

Python学成后做什么

Python并发之poolexecutor的介绍(附示例)

序列化和反序列化的详细介绍

Python是什么软件下载

Python里int什么意思

Python excel使用xlutils类库实现追加写功能的方法

Python三大框架:flask框架、tornado框架、django框架简介

实例讲解使用Python & flask 实现restful web api

windows下安装Python的xlsxwriter模块方法

Python3中* 和 ** 运算符的用法是什么

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...