python-collections模块中OrderedDict的使用

OrderedDict

在Python中,dict这个数据结构由于hash的特性,是无序的。
在collections模块中为我们提供了 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

结果

如果是普通的字典,即使传入的顺序不一样,但是依然是相同的字典
如果是orderedDict,传入的顺序不一样,那么得到的字典是不一样的

应用

常用在pytorch保存模型中,若要替换和修改模型中键值,一定要新建一个有序字典OrderedDict.

# load pretrain model
aes_pretrain_model = torch.load('123.pkl')
comp_pretrain_model = torch.load('456.pkl')

# modify key
all_model_list = []
aes_new_orderdict = collections.OrderedDict()
for key, value in aes_pretrain_model.items():
    new_key = 'backbone.aes_' + key
    all_model_list.append(new_key)
    # print(key)
    # print(new_key)
    aes_new_orderdict[new_key] = value
# print(comp_pretrain_model.keys)
comp_new_orderdict = collections.OrderedDict()
for key, value in comp_pretrain_model.items():
    new_key = 'backbone.comp_' + key
    all_model_list.append(new_key)
    # print(key)
    # print(new_key)
    comp_new_orderdict[new_key] = value

self.backbone.load_state_dict(aes_new_orderdict, strict=False)
self.backbone.load_state_dict(comp_new_orderdict, strict=False)

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2022年5月25日
下一篇 2022年5月25日

相关推荐