python OrderedDict函数详细介绍

---------------------------------------------------更新------------------------------------------------

根据python官方文档, python3.6及之后Dict就都有序了。它们(OrderedDict)变得不那么重要了

但还是有点区别的,如评论所说Dict没有move_to_end()方法,popitem()不接受可选参数,具体差距在上述链接中,我也会更新到本文第5点。

--------------------------------------------------------------------------------------------------------

做 leetcode 146. LRU缓存机制 使用到OrderedDict函数,但是网上搜的资料都是只有初始化那篇,因此更新本文。

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)])

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)    

  • Python 3.8之前, Dict缺少 __reversed__() 方法    

你可能感兴趣的:(python,python,数据结构,OrderedDict,Dict)