今天打印了下python的dict的类型,发现显示如下:
python标准库——collections模块 的OrderedDict类_字典排序
一脸懵逼,特意查看了下这个OrderedDict类型,现记录如下:

OrderedDict类

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

代码展示

from collections import OrderedDict

print('Normal Dictionary:')
d = {}
d['name'] = 'v1'
d['age'] = 'v2'
d['job'] = 'v3'
d['address'] = 'v4'

d1 = {}
d1['job'] = 'v3'
d1['address'] = 'v4'
d1['name'] = 'v1'
d1['age'] = 'v2'

print(d)
print(d1)
print(d == d1)

print('OrderedDict:')
d2 = OrderedDict()
d2['name'] = 'v1'
d2['age'] = 'v2'
d2['job'] = 'v3'

d3 = OrderedDict()
d3['job'] = 'v3'
d3['age'] = 'v2'
d3['name'] = 'v1'

print(d2)
print(d3)
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中,虽然元素都是一样,但是他们的排序是不一样的,所以是不等的。

类方法展示

由于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

如下示例:

od1 =OrderedDict()
od1['name'] = 'v1'
od1['age'] = 'v2'
od1['job'] = 'v3'
od1['address'] = 'v4'
print(od1)
od1.move_to_end('name')
print(od1)

打印结果

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