字典在Python 3.6中排序(至少在CPython实现下),与之前的版本不同.这似乎是一个重大变化,但它只是文档中的一小段.它被描述为CPython实现细节而不是语言特性,但也暗示这可能成为未来的标准.
在保留元素顺序的同时,新字典实现如何比旧字典实现更好?
以下是文档中的文字:
dict()现在使用PyPy开创的"紧凑"表示.与Python 3.5相比,新dict()的内存使用量减少了20%到25%.PEP 468(在函数中保留**kwargs的顺序.)由此实现.这个新实现的顺序保留方面被认为是一个实现细节,不应该依赖(这可能会在未来发生变化,但是在更改语言规范之前,希望在几种版本的语言中使用这个新的dict实现为所有当前和未来的Python实现强制命令保留语义;这也有助于保持与随机迭代顺序仍然有效的语言的旧版本的向后兼容性,例如Python 3.5).(由INADA Naoki在issue 27350中提供.最初由Raymond Hettinger提出的想法.)
2017年12月更新:Python 3.7 保证了dict保留插入顺序
使用PyCharm,我注意到它提供转换dict文字:
d = {
'one': '1',
'two': '2',
}
Run Code Online (Sandbox Code Playgroud)
进入一个dict构造函数:
d = dict(one='1', two='2')
Run Code Online (Sandbox Code Playgroud)
这些不同的方法在某些重要方面有所不同吗?
(在写这个问题时,我注意到使用dict()它似乎不可能指定一个数字键.. d = {1: 'one', 2: 'two'}是可能的,但显然,dict(1='one' ...)不是.还有其他吗?)
我正在尝试为我正在创建的类创建切片功能,以创建矢量表示.
到目前为止我有这个代码,我相信它会正确地实现切片,但每当我做一个调用,就像v[4]v是一个向量python返回一个关于没有足够的参数的错误.所以我试图弄清楚如何getitem在我的类中定义特殊方法来处理普通索引和切片.
def __getitem__(self, start, stop, step):
index = start
if stop == None:
end = start + 1
else:
end = stop
if step == None:
stride = 1
else:
stride = step
return self.__data[index:end:stride]
Run Code Online (Sandbox Code Playgroud) 我可以在python中为其他dicts的dict comprehension扩展语法,比如collections模块中的OrderedDict 或继承自我自己的类型dict吗?
重新绑定dict名称显然不起作用,{key: value}理解语法仍然为您提供了一个简单的旧词典,用于理解和文字.
>>> from collections import OrderedDict
>>> olddict, dict = dict, OrderedDict
>>> {i: i*i for i in range(3)}.__class__
<type 'dict'>
Run Code Online (Sandbox Code Playgroud)
那么,如果可能的话我该怎么做呢?如果它只适用于CPython,那就没关系.对于语法,我想我会尝试使用O{k: v}像我们一样的前缀r'various' u'string' b'objects'.
注意: 当然我们可以使用生成器表达式,但我更感兴趣的是看到语法方面的hathon是多么糟糕.
python dictionary cpython ordereddictionary dictionary-comprehension
from collections import OrderedDict
import pprint
menu = {"about" : "about", "login" : "login", 'signup': "signup"}
menu = OrderedDict(menu)
pprint.pprint(menu.items())
import sys
sys.exit()
Run Code Online (Sandbox Code Playgroud)
输出是:
[('about', 'about'), ('signup', 'signup'), ('login', 'login')]
Run Code Online (Sandbox Code Playgroud)
因此,即使使用,订单也不会保留OrderedDict.我知道字典默认情况下不保留初始顺序,以及所有这些内容.但我想知道为什么OrderedDict不起作用.