今天打印了下python的dict的类型,发现显示如下:
一脸懵逼,特意查看了下这个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')])