我正在寻找一个有序的关联数组,即有序的字典的可靠实现。我想要按键而不是插入顺序排序。
更准确地说,我正在寻找一种int-to-float(或另一种用例是string-to-float)映射结构的节省空间的实现,该结构的结构是:
我想到的最好的方法是将字典和键列表粘合在一起,使最后一个键按等分和插入顺序排列。
还有更好的主意吗?
“随机访问O(1)”是一个非常严格的要求,基本上要求一个基础哈希表-我希望您只表示随机READS,因为我认为它可以通过数学证明,而在一般情况下不可能拥有O
(1)编写以及O(N)有序的迭代。
我认为您不会找到适合您需求的预包装容器,因为它们是如此极端-O(log N)访问当然会改变世界。为了获得您要进行读取和迭代的big-
O行为,您需要粘合两个数据结构,本质上是一个dict和一个堆(或排序列表或树),并使它们保持同步。尽管您没有指定,但我认为您只会得到想要的 摊销 行为-
除非您真正愿意为插入和删除付出任何性能上的损失,这实际上是您表达的规范的涵义,但确实似乎不太可能是现实生活中的要求。
对于O(1)读取并 分摊 O(N)有序迭代,只需将所有键的列表保留在字典一边。例如:
class Crazy(object):
def __init__(self):
self.d = {}
self.L = []
self.sorted = True
def __getitem__(self, k):
return self.d[k]
def __setitem__(self, k, v):
if k not in self.d:
self.L.append(k)
self.sorted = False
self.d[k] = v
def __delitem__(self, k):
del self.d[k]
self.L.remove(k)
def __iter__(self):
if not self.sorted:
self.L.sort()
self.sorted = True
return iter(self.L)
如果你不喜欢“摊余O(N)令”您可以删除self.sorted,只是重复self.L.sort()
的__setitem__
本身。当然,这使写操作为O(N
log
N)(尽管我仍然在O(1)上进行写操作)。每种方法都是可行的,并且很难认为一种方法本质上优于另一种方法。如果您倾向于写一堆,然后进行一堆迭代,那么上面代码中的方法是最好的。如果通常是一次写入,一次迭代,另一次写入,另一次迭代,那么就差不多了。
顺便说一句,这利用了Python排序(又称“
timsort”)的异常(和出色;-)性能特征的无耻优势:在其中,排序一个列表,该列表大部分已排序,但最后附加了一些其他项目,基本上是O
(N)(如果与排序的前缀部分相比,粘贴的项目足够少)。我听说Java很快就会获得这种收益,因为Josh
Block对Python的技术演讲印象深刻,以至于他开始在随处的笔记本电脑上为JVM进行编码。大多数系统(包括我相信今天的Jython和IronPython在内)基本上都以O(N
log N)操作进行排序,而没有利用“大多数有序”输入;在这方面,蒂姆·彼得斯(Tim
Peters)塑造成如今的Python风格的“自然合并排序”是一个奇迹。
问题内容: 码: 打印。我不确定该方法如何确定l中关键字的顺序。但是,我希望能够以“适当”的顺序检索关键字。当然,正确的顺序将创建列表。 和这个: 问题答案: 你可以使用OrderedDict(需要Python 2.7)或更高版本。 另外,请注意,由于dict你使用进行创建的操作已经忘记了元素的顺序,因此该操作无效。相反,你想使用。 如文档中所述,对于低于python 2.7的版本,你可以使用此配
问题内容: 我有一本字典 但是,我需要字典的顺序不同: 做这个的最好方式是什么? 问题答案: 字典 没有顺序 。因此,没有办法做到这一点。 如果您使用的是python2.7 +,则可以使用-在这种情况下,您可以使用检索项目列表,然后将其反向并从反向列表中创建一个新项: 如果您使用的是旧版python,则可以从http://code.activestate.com/recipes/576693/获得
问题内容: D = {‘a’: 1, ‘b’: 2, ‘c’: 3} >>> D 我只是在Python shell中进行了此操作,我想知道为什么键“ c”会在键“ b”之后??? 问题答案: 顺序与它们内部的工作方式以及它们在哈希表中的顺序有关。这又取决于键的哈希值,键的插入顺序以及所使用的Python实现。 该顺序是任意的(但不是随机的),知道它将是哪个顺序将永远不会有用。 要获取排序的键列表,
问题内容: 有一个现有的函数以下面的结尾,其中是一个字典: 返回给定字典的未排序迭代器。我想返回一个遍历按 key 排序的项目的迭代器。我怎么做? 问题答案: 尚未对此进行广泛的测试,但是可以在Python 2.5.2中使用。 如果您习惯于使用迭代器代替迭代器,那么上面的解决方案仍然可以使用 在Python 3.x中,使用代替返回迭代器。
问题内容: 这是我的Django代码,无法正常运行: 有没有办法保持原始元素的顺序,所以帖子将按in排序? 谢谢! 编辑: Python 2.6,Django 1.3 问题答案: 使用SortedDict代替dict() SortedDict保持其属性中的顺序。因此,您可以根据需要操纵顺序而无需重建字典。例如,要反转SortedDict的顺序,只需使用
问题内容: 这个问题已经在这里有了答案 : 8年前关闭。 可能重复: Python字典,键/值的顺序应与声明的顺序相同 如果我在特定程序中有两个具有相同键(但值不同)的不同字典,.keys()的顺序是否相同?我做了一些测试,似乎是这样,但是在不知道dict的内部如何的情况下,我不确定是否可以保证。 谢谢, 问题答案: 您完全不能依赖键顺序: 字典是无序的。在Python 2.7中有。