通用Python数据结构
更多关于Python的知识请访问易湃Python易湃Pythonwww.easypython.cn
在我们开始学习Python的时,,内置的数据结构List,Tuple,Dictionary,Set已足够我们使用。
但是随着实践的深入,我们需要构建的数据结构就会越来越复杂,在此文中,我将向您介绍更多实用的,包含在标准库的Python数据结构,熟悉它们将帮助您更好的构建代码。
Dictionaries, Maps与 Hash Tables
在Python中,字典(或简称为dict)是中央数据结构(central data structure)。字典存储任意数量的对象,每个对象都由唯一的字典键标识。
字典通常也称为映射,哈希图,查找表或关联数组。它们允许有效查找,插入和删除与给定键关联的任何对象。
dict
Python还提供了一些有用的语法糖,用于在程序中使用字典。例如,字典表达式:
>>> squares = {x: x * x for x in range(6)}
>>> squares
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
对于大多数使用情况,Python的内置字典实现将满足您的所有需求。字典经过了高度优化,并构成语言的许多部分。例如,堆栈框架中的类属性和变量都存储在内部字典中。
ython字典基于经过良好测试和精心调整的哈希表实现,可提供您期望的性能特征:平均情况下查找,插入,更新和删除操作O(1)的时间复杂度。
除了普通dict对象之外,Python的标准库还包括许多专用的字典实现。这些专业词典均基于内置词典类(并具有其性能特征),但还包含一些其他便利功能。
collections.OrderedDict:记住键的插入顺序
Python包含一个专门的dict子类,该子类记住添加到它的键的插入顺序:collections.OrderedDict(必须从collections标准库中的模块中导入)。
尽管标准dict在CPython 3.6及更高版本中保留了键的插入顺序,但这只是CPython实现的副作用,并且直到Python 3.7才在语言规范中定义。因此,如果键顺序对于算法的工作很重要,那么最好通过显式使用OrderedDict类来明确传达这一点:
>>> import collections
>>> d = collections.OrderedDict(one=1, two=2, three=3)
>>> d
OrderedDict([('one', 1), ('two', 2), ('three', 3)])
>>> d["four"] = 4
>>> d
OrderedDict([('one', 1), ('two', 2),
('three', 3), ('four', 4)])
>>> d.keys()
odict_keys(['one', 'two', 'three', 'four'])
在Python 3.8之前,您无法使用reversed()反向遍历字典项。仅OrderedDict实例提供该功能。
collections.defaultdict:返回缺少键的默认值
dict查找的key不存在的时候就会报KeyError,一般我们会使用dict.setdefault()函数来解决这个问题。但是,defaultdict提供了更优雅的解决方式,一开始就指定了默认值:
>>> from collections import defaultdict
>>> dd = defaultdict(list) #指定默认值为list
>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list() in this example:
>>> dd["dogs"].append("Rufus")
>>> dd["dogs"].append("Kathrin")
>>> dd["dogs"].append("Mr Sniffles")
>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
>>> dd["cats"]
[]
collections.ChainMap:将多个词典作为一个映射进行搜索
collections.ChainMap数据结构组多个词典成一个单一的的映射。查找则会搜索多个映射,直到找到一个键。插入,更新和删除仅影响添加到链中的第一个映射:
>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> c