python标准库——collections模块 的OrderedDict类
1.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')])