Python 中的常规字典 vs 顺序字典

2024年8月29日 | 阅读 7 分钟

众所周知,字典是 Python 中最重要的数据结构,并且会记住其项目的顺序(根据其最新更新)。Python 字典像映射一样存储数据值;持有键值对。字典提供了键值对,使其更加优化。

标准字典的问题在于它不记得键值对的插入顺序,因此会根据它们在哈希表中存储的方式来迭代键。

Python 提供了 OrderDict 类型,它会记住字典中(键,值)对的插入顺序。

在本教程中,我们将学习常规字典和有序字典 OrderDict 之间的区别。我们将创建并使用 OrderedDict 对象。我们还将确定 OrderedDictdict 之间的区别。

开始使用 OrderDict

Python 的 OrderDict 是一个 dict 子类,它存储键值对插入字典的顺序。我们将按照插入顺序获取项目。如果我们更新现有键的值,顺序将保持不变。如果我们删除一个项目然后重新插入它,该项目将被插入到字典的末尾。

它包含所有 Python 字典方法,并具有一些附加功能。让我们了解如何在 Python 中创建 OrderDict。

创建 OrderDict 对象

要创建 OrderDict,我们需要从 collections 中导入该类。有多种创建 OrderDict 的方法,其中许多与常规字典相同。让我们创建一个有序字典。

输出

OrderedDict()
OrderedDict([('one', 1), ('two', 2), ('three', 3)])

在上面的代码中,我们首先从 collections 导入 OrderDict,并通过实例化 OrderDict(不传递任何参数)来创建一个空字典。

我们可以通过在方括号([])中提供键来传递键值对给字典。我们以与它们被插入到字典中相同的顺序获取项目。让我们来理解下面的例子。

示例 -

输出

OrderedDict([('one', 1), ('two', 2), ('three', 3)])
OrderedDict([('a', 1), ('c', 3), ('b', 2)])

在上面的代码中,我们已经传入了列表并将其设置为 OrderedDict() 构造函数。对于列表或元组,生成的有序字典与输入序列中项目的原始顺序匹配。但是,在创建 OrdereDict 之前,项目的最终顺序是未知的。

我们可以通过将关键字参数传递给类构造函数来创建有序字典。

示例 -

输出

OrderedDict([('one', 1), ('two', 2), ('three', 3)])

OrderedDict 提供了 fromkeys(),它从键的可迭代对象创建一个新字典,并将其所有值设置为公共值。

输出

OrderedDict([('one', 0), ('two', 0), ('three', 0)])

在这种情况下,我们使用键列表作为起点来创建一个有序字典。.fromkeys() 的第二个参数为字典中的所有项目提供单个值。

管理 OrderedDict 中的项目

我们可以在 OrdereDict 中执行变异操作;这意味着我们可以修改 OrderedDict 的行为。我们可以插入新项目,更新和删除现有项目,等等。如果新添加的项目被插入到现有的有序字典中,则该项目将被添加到字典的末尾。

让我们理解以下示例 -

示例 -

输出

OrderedDict([('one', 1), ('two', 2), ('three', 3), ('four', 4)])

新添加的项目 ('four', 4) 被放置在底层字典的末尾。我们可以看到现有项目的顺序保持不变。

当我们删除任何键并插入同一项目的同一个实例时,新项目将被添加到底层字典的末尾。让我们看下面的例子。

示例 -

输出

OrderedDict([('one', 1), ('three', 3)])
OrderedDict([('one', 1), ('three', 3), ('two', 2)])

当我们更新现有值时,键保持不变,但在原地分配了新值。

迭代 OrderedDict

我们可以像常规字典一样迭代 OrdereDict。我们可以直接迭代键,或者我们可以使用内置方法,如 .items(), keys(),values()

示例 -

输出

one -> 1
two -> 2
three -> 3
four -> 4
one -> 1
two -> 2
three -> 3
four -> 4
one -> 1
two -> 2
three -> 3
four -> 4
1
2
3
4

解释 -

在上面的代码中,我们直接迭代了键,并使用字典方法迭代了 num OrderedDict。

OrderedDict 和 Dictionary 之间的区别

在 Python 的早期版本中,Dictionary 被定义为无序数据结构。如果 Python 开发人员需要排序数据,他们会转向列表和其他数据结构来保持数据有序。随着时间的推移,开发人员发现字典可以保持其项目的有序性。

2008 年,PEP 372 引入了添加一个可以记住按插入键顺序定义的项目顺序的集合类的想法。

当 Python 发布 3.6 版本时,它修改了标准字典的实现。其新实现具有许多特性,例如更少的内存使用和迭代效率,以及一个意外的特性:dict 对象现在可以按引入的顺序保留其项目。

让我们了解常规字典和 OrderedDict 之间的基本区别。

示例 - 初始化字典

输出

Regular dictionary:
b 98
c 99
d 100
e 101
f 102
g 103
OrderedDict:
a 97
b 98
c 99
d 100
e 101
f 102

删除和更新

让我们了解 OrderedDict 和 dictionary 如何进行删除和更新或重新插入。

示例 -

输出

Before deleting:
Regular dictionary:
a 1
b 2
c 3
d 4

Ordered dictionary:
a 1
b 2
c 3
d 4

After deleting:

Regular dictionary:
a 1
b 2
d 4

Ordered dictionary:
a 1
b 2
d 4

After re-inserting:

Regular dictionary:
a 1
b 2
d 4
c 3

Ordered dictionary:
a 1
b 2
d 4
c 3

OrderedDict 和 Dictionary 之间的比较

以下比较将帮助选择更相关的差异和功能。让我们来理解下面的比较。

示例 -

序号。OrderedDict字典(Dict)
1.自 Python 3.1 版本以来,它维护键的插入顺序。自 Python 3.6 版本以来,它维护键的插入顺序。
2.它提供了关于项目顺序的可读性和意图信号。它提供了关于项目顺序的可读性和意图信号。
3.它对项目顺序的控制非常高它对项目顺序的控制很低
4.它消耗的内存要多得多。它消耗的内存比 OrderedDict 少。
5.自 Python 3.5 以来,它支持反向迭代。自 Python 3.5 以来,它不支持反向迭代。
6.其操作性能较低。其操作性能很高。
7.它支持合并 (|) 和更新 (|=) 字典运算符。它不支持合并 (|) 和更新 (|=) 字典运算符。

结论

本教程包括了常规字典和 OrderedDict 之间的区别以及 OrderedDict 的介绍。Python 字典无法记住键的顺序,因此 Python 开发人员创建了 OrderedDict,它是专门设计用来保持项目有序的。

但是 Python 3.6 引入了一个新特性,即 dict 对象可以记住项目的顺序。本教程提供了这两种字典的精确见解,这将帮助您根据您的需求选择合适的字典。