一尘不染

在Python 3.6及更高版本中按位置访问字典项

python

我了解字典在Python 3.6+中是按插入顺序排序的在3.6中是实现的细节,在3.7+中是官方的。

给定它们的顺序,似乎不存在通过插入顺序来检索字典的第 i
个项目的方法,这很奇怪。可用的唯一解决方案似乎具有O(
n )复杂度,或者:

  1. 通过O( n )进程转换为列表,然后使用list.__getitem__
  2. enumerate循环字典字典项,并在达到所需索引时返回值。同样,时间复杂度为O( n )。

由于从a获取项目的list复杂度为O(1),是否有办法用字典实现相同的复杂度?与常规dictcollections.OrderedDict将工作。

如果不可能,是否有结构上的原因阻止这种方法,或者这仅仅是尚未考虑/实现的功能?


阅读 188

收藏
2020-12-20

共1个答案

一尘不染

对于,OrderedDict这本质上O(n)是因为排序记录在链接列表中。

对于内置的dict,有一个向量(一个连续的数组)而不是一个链表,但是最后几乎是一样的:向量包含几种“假人”,特殊的内部值表示“没有密钥。或“曾经存储在这里但不再存储的密钥”。例如,这使得删除密钥变得非常便宜(只需用虚拟值覆盖密钥)。

但是,如果不在此之上添加辅助数据结构,就无法跳过虚拟变量而不一次移动它们。因为Python使用一种开放式寻址的形式来解决冲突,并将负载因子保持在2/3以下,所以向量的至少三分之一
假人。 the_vector[i]可以及时访问O(1),但实际上与第i个非虚拟条目没有可预测的关系。

2020-12-20