相关疑难解决方法(0)

OrderedDict会在Python 3.7中变得多余吗?

Python 3.7更改日志:

dict对象的插入顺序保存性质已被声明为Python语言规范的官方部分.

这是否意味着OrderedDict会变得多余?我能想到的唯一用途是保持与旧版本Python的向后兼容性,这些版本不保留普通字典的插入顺序.

python dictionary python-3.x python-3.7 ordereddict

55
推荐指数
1
解决办法
4746
查看次数

有效地按Python 3.6+中的位置访问字典项

我理解字典是在Python 3.6+中排序插入,作为3.6中的实现细节和3.7+中的官方.

鉴于它们是有序的,似乎很奇怪,没有方法可以通过插入顺序检索字典的i项.该唯一的解决方案可出现有O(ñ)的复杂性,无论是:

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

由于从list具有O(1)复杂度的项目中获取项目,是否有办法通过字典实现相同的复杂性?无论是定期dict还是collections.OrderedDict工作.

如果不可能,是否存在阻止这种方法的结构性原因,或者这只是一个尚未考虑/实施的特征?

python dictionary python-3.x python-internals

26
推荐指数
1
解决办法
2567
查看次数

内部如何使用Python语法?

我正在努力深入了解Python的工作原理,我一直在查看http://docs.python.org/3.3/reference/grammar.html上显示的语法.

我注意到它说你也必须改变parsermodule.c,但说实话我只是不关注这里发生了什么.

我理解语法是如何阅读语言的规范,但是......我甚至不知道这是什么写的.它看起来几乎像Python,但事实并非如此.

我希望更好地理解这个规范以及Python如何在内部使用它来做.... 什么取决于它(答案是一切,但我的意思是"引擎"的哪个方面正在处理它),使用它的是什么,它如何配合编译/运行脚本?

很难相信整个语言都归结为两页规范......

python grammar language-design python-3.x

16
推荐指数
3
解决办法
3777
查看次数

OrderedDict与Python中的Dict

蒂姆彼得的答案中,"有没有理由不使用有序词典",他说

OrderedDict是dict的子类.

它的速度并不慢很多,但至少使用普通字典使内存翻倍.

现在,在经历一个特定的问题时,我尝试了一些样本检查,ipython并且两者都与之前的推理相矛盾:

  1. dictOrderedDict相同尺寸的
  2. 上的操作OrderedDict周围7-8倍更多的时间花费容易不是在操作dict(因此慢了很多)

有人可以向我解释我在推理中出错的地方吗?


创建一个大型Dict和OrderedDict并比较大小:

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)

python dictionary ordereddictionary

15
推荐指数
1
解决办法
4839
查看次数

如何将嵌套的OrderedDict转换为dict?

我有一个嵌套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 dictionary

14
推荐指数
3
解决办法
1万
查看次数

相当于python的-R选项会影响整数的哈希值

我们有一大堆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 pypy python-2.7 python-3.x

13
推荐指数
1
解决办法
426
查看次数

为什么我无法通过索引获取字典键?

从 Python 3.7开始,字典是有序的。那么为什么我不能通过索引获取键呢?

python dictionary python-3.x

5
推荐指数
1
解决办法
1110
查看次数

OrderedDict是树吗?

OrderedDict是一个保留项目顺序的集合(插入它们的顺序).我不认为这可以通过哈希表实现(我认为常规字典使用)所以用于实现它的平衡树是什么?

我假设有许多依赖,如Python 2/3和CPython/IPython/others.

python dictionary ordereddictionary

3
推荐指数
1
解决办法
3689
查看次数