1、定义
python中字典Dict是利用hash存储,因为各元素之间没有顺序。OrderedDict听名字就知道他是 按照有序插入顺序存储 的有序字典。 除此之外还可根据key, val进行排序。
2、初始化
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
3、排序
OrderedDict可根据key 或者val 进行排序。
1 dd = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}
2 # 按key排序
3 kd = collections.OrderedDict(sorted(dd.items(), key=lambda t: t[0]))
4 print kd
5 # 按照value排序
6 vd = collections.OrderedDict(sorted(dd.items(),key=lambda t:t[1]))
7 print vd
8
9 # 输出
10 OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
11 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')
5、与Dict区别
常规的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)
3、字典排序
# 声明字典
key_value ={}
# 初始化
key_value[2] = 56
key_value[1] = 2
key_value[5] = 12
key_value[4] = 24
key_value[6] = 18
key_value[3] = 323
# sorted(key_value) 返回重新排序的列表
# 字典按键排序
for i in sorted (key_value) :
print ((i, key_value[i]), end =" ")
执行以上代码输出结果为:
按键(key)排序:
(1, 2) (2, 56) (3, 323) (4, 24) (5, 12) (6, 18)
print ("按值(value)排序:")
print(sorted(key_value.items(), key = lambda kv:(kv[1], kv[0])))
执行以上代码输出结果为:
按值(value)排序:
[(1, 2), (5, 12), (6, 18), (4, 24), (2, 56), (3, 323)]
实例 3 : 字典列表排序
lis = [{ "name" : "Taobao", "age" : 100},
{ "name" : "Runoob", "age" : 7 },
{ "name" : "Google", "age" : 100 },
{ "name" : "Wiki" , "age" : 200 }]
# 通过 age 升序排序
print ("列表通过 age 升序排序: ")
print (sorted(lis, key = lambda i: i['age']) )
print ("\r")
# 先按 age 排序,再按 name 排序
print ("列表通过 age 和 name 排序: ")
print (sorted(lis, key = lambda i: (i['age'], i['name'])) )
print ("\r")
# 按 age 降序排序
print ("列表通过 age 降序排序: ")
print (sorted(lis, key = lambda i: i['age'],reverse=True) )
执行以上代码输出结果为:
列表通过 age 升序排序:
[{'name': 'Runoob', 'age': 7}, {'name': 'Taobao', 'age': 100},
{'name': 'Google', 'age': 100}, {'name': 'Wiki', 'age': 200}]
列表通过 age 和 name 排序:
[{'name': 'Runoob', 'age': 7}, {'name': 'Google', 'age': 100},
{'name': 'Taobao', 'age': 100}, {'name': 'Wiki', 'age': 200}]
列表通过 age 降序排序:
[{'name': 'Wiki', 'age': 200}, {'name': 'Taobao', 'age': 100},
{'name': 'Google', 'age': 100}, {'name': 'Runoob', 'age': 7}]