python中字典Dict是利用hash存储,因为各元素之间没有顺序。OrderedDict听名字就知道他是 按照有序插入顺序存储 的有序字典。 除此之外还可根据key, val进行排序。
2.1 先初始化定义一个OrderedDict,然后按照键值对插入,此时dict可以记录插入字典的顺序
import collections
d = collections.OrderedDict()
d["name"] = "muya"
d["age"] = 25
d["money"] = "Zero"
for key, value in d.items():
print(key, value)
# 输出:
# name muya
# age 25
# money Zero
2.2 在定义时初始化好键值对,但这些初始化的内容无法实现有序。不过之后再对该字典进行插入的键值仍然是有序的。
import collections
d = collections.OrderedDict(name="muya", age=25, money="Zero")
d["dream"] = "have money"
d["other dream"] = "have gf"
for key, value in d.items():
print(key, value)
# 输出:
# money Zero
# age 25
# name muya
# dream have money
# other dream have gf
OrderedDict可根据key 或者val 进行排序。
dd = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}
# 按key排序
kd = collections.OrderedDict(sorted(dd.items(), key=lambda t: t[0]))
print kd
# 按照value排序
vd = collections.OrderedDict(sorted(dd.items(),key=lambda t:t[1]))
print vd
# 输出
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
import collections
dic = collections.OrderedDict()
# clear(清空有序字典)
dic.clear()
# copy(拷贝)
new_dic = dic.copy()
# fromkeys(指定一个列表,把列表中的值作为字典的key,生成一个字典)
name = ['tom','lucy','sam']
dic.fromkeys(name)
dic.fromkeys(name,20)
# items(返回由“键值对组成元素“的列表)
dic.items()
# keys(获取字典所有的key)
dic.keys()
# values(获取字典所有的value,返回一个列表)
dic.value()
# move_to_end(指定一个key,把对应的key-value移到最后)
dic["name"] = "muya"
dic["age"] = 25
dic["money"] = "Zero"
dic.move_to_end("name") # 将name移到最后
dic.move_to_end("money", last=False) # 设置last为False, 将money移到最前面
# pop(获取指定key的value,并在字典中删除)
dic.pop("name") # 删除name, 注意必须指定关键字key
# popitem(按照后进先出原则,删除最后加入的元素,返回key-value)
dic.popitem() # 删除最后加入的
dic.popitem(last=False) # 删除第一个加入的
# setdefault(获取指定key的value,如果key不存在,则创建)
val = dic.setdefault('k5')
常规的Dict被设计为非常擅长映射操作。 跟踪插入顺序是次要的
OrderedDict旨在擅长重新排序操作。 空间效率、迭代速度和更新操作的性能是次要的
OrderedDict在频繁的重排任务中还是比Dict更好,这使他更适用于实现各种 LRU 缓存
OrderedDict类的 popitem() 方法有不同的签名。它接受一个可选参数来指定弹出哪个元素
弹出最后面元素:常规的Dict使用 d.popitem() ,OrderedDict类使用od.popitem()
弹出第一个元素:常规的Dict使用 (k := next(iter(d)), d.pop(k)) ,OrderedDict类使用od.popitem(last=False)
类有一个 move_to_end() 方法,可以有效地将元素移动到任一端
将K,V对移到最后面:常规的Dict使用 d[k] = d.pop(k) ,OrderedDict类使用od.move_to_end(k, last=True)
将K,V对移到最前面:常规的Dict没有对应功能,OrderedDict类使用od.move_to_end(k, last=False)
Python 3.8之前, Dict缺少 reversed() 方法
《AUTOSAR谱系分解(ETAS工具链)》之总目录