这是否意味着OrderedDict会变得多余?我能想到的唯一用途是保持与旧版本Python的向后兼容性,这些版本不保留普通字典的插入顺序.
我理解字典是在Python 3.6+中排序的插入,作为3.6中的实现细节和3.7+中的官方.
鉴于它们是有序的,似乎很奇怪,没有方法可以通过插入顺序检索字典的第i项.该唯一的解决方案可出现有O(ñ)的复杂性,无论是:
list.__getitem__.enumerate循环中的字典项,并在达到所需索引时返回值.同样,O(n)时间复杂度.由于从list具有O(1)复杂度的项目中获取项目,是否有办法通过字典实现相同的复杂性?无论是定期dict还是collections.OrderedDict工作.
如果不可能,是否存在阻止这种方法的结构性原因,或者这只是一个尚未考虑/实施的特征?
我正在努力深入了解Python的工作原理,我一直在查看http://docs.python.org/3.3/reference/grammar.html上显示的语法.
我注意到它说你也必须改变parsermodule.c,但说实话我只是不关注这里发生了什么.
我理解语法是如何阅读语言的规范,但是......我甚至不知道这是什么写的.它看起来几乎像Python,但事实并非如此.
我希望更好地理解这个规范以及Python如何在内部使用它来做.... 什么取决于它(答案是一切,但我的意思是"引擎"的哪个方面正在处理它),使用它的是什么,它如何配合编译/运行脚本?
很难相信整个语言都归结为两页规范......
在蒂姆彼得的答案中,"有没有理由不使用有序词典",他说
OrderedDict是dict的子类.
它的速度并不慢很多,但至少使用普通字典使内存翻倍.
现在,在经历一个特定的问题时,我尝试了一些样本检查,ipython并且两者都与之前的推理相矛盾:
dict与OrderedDict相同尺寸的OrderedDict周围7-8倍更多的时间花费容易不是在操作dict(因此慢了很多)有人可以向我解释我在推理中出错的地方吗?
import sys
import random
from collections import OrderedDict
test_dict = {}
test_ordered_dict = OrderedDict()
for key in range(10000):
test_dict[key] = random.random()
test_ordered_dict[key] = random.random()
sys.getsizeof(test_dict)
786712
sys.getsizeof(test_ordered_dict)
786712
Run Code Online (Sandbox Code Playgroud)
%timeit:import sys
import random
from collections import OrderedDict
def operate_on_dict(r):
test_dict = {}
for key in range(r):
test_dict[key] = random.random()
def operate_on_ordered_dict(r):
test_ordered_dict = OrderedDict()
for key …Run Code Online (Sandbox Code Playgroud) 我有一个嵌套OrderedDict我想转换成一个dict.dict()在它上面应用显然只会转换最后一个条目的最外层.
from collections import OrderedDict
od = OrderedDict(
[
(u'name', u'Alice'),
(u'ID', OrderedDict(
[
(u'type', u'card'),
(u'nr', u'123')
]
)),
(u'name', u'Bob'),
(u'ID', OrderedDict(
[
(u'type', u'passport'),
(u'nr', u'567')
]
))
]
)
print(dict(od))
Run Code Online (Sandbox Code Playgroud)
输出:
{u'name': u'Bob', u'ID': OrderedDict([(u'type', u'passport'), (u'nr', u'567')])}
Run Code Online (Sandbox Code Playgroud)
是否有直接的方法来转换所有出现的?
我们有一大堆python代码,它们需要一些输入并产生一些输出.
我们希望保证,在相同输入的情况下,无论python版本还是本地环境,我们都会生成相同的输出.(例如代码是在Windows,Mac还是Linux上运行,32位或64位)
我们已经在自动化测试套件中执行了这个操作,通过运行我们的程序,无论是否有-Rpython选项和比较输出,假设这会消除我们的输出意外结束的任何位置依赖于迭代超过a dict.(我们的代码中最常见的非确定性来源)
但是,由于我们最近调整了代码以支持python 3,我们发现了一个地方,我们的输出部分依赖于dict使用ints作为键的迭代.与python2相比,这个迭代顺序在python3中发生了变化,并使我们的输出变得不同.我们现有的测试(全部在python 2.7上)没有注意到这一点.(因为-R不影响ints 的哈希)一旦找到,它很容易修复,但我们希望早点找到它.
是否有任何方法可以进一步对我们的代码进行压力测试,并让我们相信我们已经根据python版本/环境可能会有所不同的内容隐瞒了我们最终隐藏的所有地方?我认为,类似-R或者PYTHONHASHSEED是应用于数字以及为str,bytes,和datetime对象可以工作,但我开到其他的方法.但是,如果可能的话,我希望我们的自动测试机只需要安装一个python版本.
另一个可接受的替代方案是使用pypy调整运行我们的代码的某种方式,以便在迭代项目时使用不同的顺序dict; 我认为我们的代码是在pypy上运行的,尽管它不是我们曾经明确支持过的东西.但是,如果一些pypy专家为我们提供了一种在不同的运行中调整字典迭代顺序的方法,那么我们将努力实现这一目标.
从 Python 3.7开始,字典是有序的。那么为什么我不能通过索引获取键呢?
OrderedDict是一个保留项目顺序的集合(插入它们的顺序).我不认为这可以通过哈希表实现(我认为常规字典使用)所以用于实现它的平衡树是什么?
我假设有许多依赖,如Python 2/3和CPython/IPython/others.
python ×8
dictionary ×6
python-3.x ×5
grammar ×1
ordereddict ×1
pypy ×1
python-2.7 ×1
python-3.7 ×1