python标准库——collections模块 的OrderedDict类

Python中的字典(dict)对象可以使用‘键、值’对的形式存取值,但默认的内置类型字典中的元素是无序的。Collections模块下的OrderedDict类实现了对字典的排序,OrderedDict是dict的一个子类,实现了对字典排序的功能,看下下面两种数据类型的对比。

2.1.代码展示

 1 from collections import OrderedDict
 2 
 3 print('Normal Dictionary:')
 4 d = {}
 5 d['name'] = 'v1'
 6 d['age'] = 'v2'
 7 d['job'] = 'v3'
 8 d['address'] = 'v4'
 9 
10 d1 = {}
11 d1['job'] = 'v3'
12 d1['address'] = 'v4'
13 d1['name'] = 'v1'
14 d1['age'] = 'v2'
15 
16 print(d)
17 print(d1)
18 print(d == d1)
19 
20 print('OrderedDict:')
21 d2 = OrderedDict()
22 d2['name'] = 'v1'
23 d2['age'] = 'v2'
24 d2['job'] = 'v3'
25 
26 d3 = OrderedDict()
27 d3['job'] = 'v3'
28 d3['age'] = 'v2'
29 d3['name'] = 'v1'
30 
31 print(d2)
32 print(d3)
33 print(d2 == d3)

输出结果

Normal Dictionary:
{'name': 'v1', 'age': 'v2', 'job': 'v3', 'address': 'v4'}
{'job': 'v3', 'address': 'v4', 'name': 'v1', 'age': 'v2'}
True
OrderedDict:
OrderedDict([('name', 'v1'), ('age', 'v2'), ('job', 'v3')])
OrderedDict([('job', 'v3'), ('age', 'v2'), ('name', 'v1')])
False

上面的代码可以看出,在dict中,如果两个字典中的的元素相同,就可以判定这两个字典是相等的,尽管我们看到他们的排序是不一样,因为dict是无序的;而OrderedDict中,虽然元素都是一样,但是他们的排序是不一样的,所以是不等的。

3.1.类方法展示

由于OrderedDict是dict的子类,此处仅写出OrderedDict独有的方法。

move_to_end(key)
将将一个元素从当前位置移动的最后。
    def move_to_end(self, key, last=True):
        '''Move an existing element to the end (or beginning if last==False).

        Raises KeyError if the element does not exist.
        When last=True, acts like a fast version of self[key]=self.pop(key).

        '''
        link = self.__map[key]
        link_prev = link.prev
        link_next = link.next
        link_prev.next = link_next
        link_next.prev = link_prev
        root = self.__root
        if last:
            last = root.prev
            link.prev = last
            link.next = root
            last.next = root.prev = link
        else:
            first = root.next
            link.prev = root
            link.next = first
            root.next = first.prev = link

    def __sizeof__(self):
        sizeof = _sys.getsizeof
        n = len(self) + 1                       # number of links including root
        size = sizeof(self.__dict__)            # instance dictionary
        size += sizeof(self.__map) * 2          # internal dict and inherited dict
        size += sizeof(self.__hardroot) * n     # link objects
        size += sizeof(self.__root) * n         # proxy objects
        return size

    update = __update = MutableMapping.update

3.1.1代码展示

1 od1 =OrderedDict()
2 od1['name'] = 'v1'
3 od1['age'] = 'v2'
4 od1['job'] = 'v3'
5 od1['address'] = 'v4'
6 print(od1)
7 od1.move_to_end('name')
8 print(od1)

打印结果

OrderedDict([('name', 'v1'), ('age', 'v2'), ('job', 'v3'), ('address', 'v4')])
OrderedDict([('age', 'v2'), ('job', 'v3'), ('address', 'v4'), ('name', 'v1')])