当前位置: 首页 > 面试题库 >

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

古彦
2023-03-14
问题内容

我了解字典在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将工作。

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


问题答案:

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

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

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



 类似资料:
  • 我试图使用CSS Flexbox(display:flex)占据窗口的剩余高度。我还想滚动可用。。。也许我在这件事上做得不对,但我已经找了这么久,以至于我找不到其他的选择。 这个想法是有一个固定的容器。在那个固定的容器内是一个柔性盒子,占据了100%的高度。我将项目添加到堆叠在列中的灵活框中。我添加的最后一个项目(容器包装器)里面有动态内容,它将通过AJAX调用替换超文本标记语言(否则我只会将操作

  • 如何在Swift中到达以下字典中的第二个整数(键)?而且,当我这样做的时候,我怎样才能找到第二个字典里的字串呢? 我尝试编写(例如)var test:Int=activeCustomers[1][1],但这不起作用。它说字典里没有一个叫下标的成员。

  • 我有一个在eclipse上运行的项目,但当我制作“java-jar”时,它会出现以下错误: 当我制作“java-version”时,输出是: 我做错了什么?

  • 现在使用了Pypy首创的“紧凑”表示形式。与Python3.5相比,新的dict()的内存使用量减少了20%到25%。PEP 468(保留函数中**kwargs的顺序。)是通过这个来实现的。这个新实现的保序方面被认为是一个实现细节,不应该被依赖(这在将来可能会改变,但是在更改语言规范以强制所有当前和将来的Python实现的保序语义之前,希望在几个版本中使用这个新的dict实现;这也有助于保持与仍然

  • 问题内容: 我有一本包含字典的字典,其中可能还包含字典,例如 目前,我正在打开包装以获取ID 001的“开单至”,“交易参考” a1,如下所示: 我忍不住觉得这有点笨拙,尤其是最后两行-我觉得以下内容应该可以工作: 有没有一种更简单的方法可以向下钻取嵌套字典而不必解压缩临时变量? 问题答案: 实际有效。是表示的表达式,因此您可以在其中进行查找。对于实际程序,我更喜欢使用面向对象的方法来嵌套字典。对

  • 问题内容: 我想在页面中显示Web应用程序的当前运行版本。该项目基于Maven,Spring和Wicket。 我想以某种方式获取maven的值并在我的spring XML文件中使用它,类似于我使用Spring PropertyPlaceholderConfigurer读取属性文件以获取我在应用程序中使用的设置的方式。 如果我在Spring配置中将maven 用作变量,则可以执行以下操作: 我怎样才