Python 有序字典
前言
在许多编程语言中,字典(dictionary)是一种非常有用的数据结构,它能通过键(key)快速查找对应的值(value)。而在 Python 中,字典是一种非常重要的数据类型,它可以很方便地用来存储和操作数据。然而,在一些情况下,我们需要保留字典中键值对的插入顺序,这时候就需要使用有序字典了。
什么是有序字典
有序字典(OrderedDict)是一个 Python 内置模块 collections 里的字典子类,它可以维护键值对插入的顺序。与常规字典不同的是,当对有序字典进行迭代时,它会按照插入顺序依次输出键值对,而不是按照键的顺序或者是随机顺序。
下面是一个简单的例子,展示了有序字典和普通字典的区别:
from collections import OrderedDict
# 普通字典插入顺序不确定
d = {}
d['a'] = 1
d['b'] = 2
d['c'] = 3
print(d) # {'a': 1, 'b': 2, 'c': 3}
# 有序字典会维护插入顺序
od = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3
print(od) # OrderedDict([('a', 1), ('b', 2), ('c', 3)])
可以看到,当使用普通字典时,其键值对的顺序是不确定的。而在使用有序字典时,通过输出的结果可以发现它保留了插入顺序。
有序字典的使用
创建有序字典
创建有序字典的方法与创建普通字典相同,只需使用 OrderedDict() 函数即可:
from collections import OrderedDict
od = OrderedDict()
添加键值对
添加键值对到有序字典的方法跟普通字典一样:
od = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3
访问键值对
有序字典的键值对可以通过索引和键来访问:
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od[0]) # KeyError: 0
print(od['a']) # 1
可以看到,通过索引访问有序字典会触发 KeyError 异常,而通过键来访问则能正确获取值。
修改键值对
与普通字典相同,有序字典的键值对也是可以被修改的:
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
od['a'] = 4
print(od) # OrderedDict([('a', 4), ('b', 2), ('c', 3)])
删除键值对
由于有序字典维护了键值对的插入顺序,所以删除键值对时可以选择按照键或者索引来指定需要删除的元素。与普通字典一样,使用 del 关键字即可删除键值对:
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
del od['a']
print(od) # OrderedDict([('b', 2), ('c', 3)])
迭代有序字典
有序字典按照插入顺序维护了键值对的次序,因此在迭代有序字典时,它会按照插入顺序依次输出键值对。
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
for key, value in od.items():
print(key, value)
# a 1
# b 2
# c 3
可以看到,按照键值对的插入顺序依次输出了各元素的键和值。
反转有序字典
在某些情况下,需要翻转有序字典的键和值。可以使用 reversed() 函数反转键和值:
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
reversed_od = OrderedDict(reversed(list(od.items())))
print(reversed_od) # OrderedDict([(3, 'c'), (2, 'b'), (1, 'a')])
利用有序字典对数据进行排序
有序字典同样可以用来对数据进行排序。可以使用 sorted() 函数和 lambda 表达式来根据元素的值对它们进行排序:
from collections import OrderedDict
d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
od = OrderedDict(sorted(d.items(), key=lambda t: t[1]))
print(od) # OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
可以看到,使用 sorted() 函数和 lambda 表达式对字典进行排序后,得到了一个有序字典。
结论
有序字典是 Python 中一个非常实用的数据结构,它可以帮助开发者在某些特定的场合下保留字典中元素的插入顺序。使用有序字典的时候,需要注意的是它是 collections 模块中的一个字典子类,因此需要使用相应的方式来创建和操作。