有序字典。
项目描述
odict
保留项目插入顺序的字典(使用内部双链表)。在本实现中,替换现有项将保持其在原始位置。
内部表示:字典的值。
[pred_key, val, succ_key]
元素序列使用双链表。链接是字典键。self.lh和self.lt是odict中插入的第一个和最后一个元素的键。
动机
当创建此包时,collections.OrderedDict尚未存在。
另一个问题是,dict 并不能总是与其他基类结合使用进行继承。这可能会导致实例布局冲突或其他错误。因此,odict 被设计成允许你修改字典的基实现。
用法
导入并创建有序字典。
from odict import odict
od = odict()
自定义 odict
可以使用 _odict 基类实现一个不继承自 dict 类型的有序字典。这在例如持久化到 ZODB 时非常有用。
同时继承自 dict 和 Persistent 会失败。另外,使用常规的 list 作为内部双链表表示形式也会引发问题,所以我们还为其定义了一个自定义类。
from persistent.dict import PersistentDict
from persistent.list import PersistentList
class podict(_odict, PersistentDict):
def _dict_impl(self):
return PersistentDict
def _list_factory(self):
return PersistentList
Python < 3.7
在 Python < 3.7 中,转换为 dict 会失败。原因可以在 这里 找到。dict 的 __init__ 函数检查 arg 是否为 dict 的子类,如果是,则忽略重写的 __getitem__ & co。这后来因为 pickle 的行为问题而被修复并回滚。
>>> dict(odict([(1, 1)]))
{1: [nil, 1, nil]}
请使用以下方法之一进行类型转换。
>>> dict(odict([(1, 1)]).items())
{1: 1}
>>> odict([(1, 1)]).as_dict()
{1: 1}
杂项
在 C 语言中重新实现这种数据结构时,如果同时给定一个值和它的键,可以大大简化(并加速)事情。有了这个,你可以使用正常的 C 指针。
Python 版本
Python 2.7, 3.7+
可能与其他/较旧版本兼容
贡献者
bearophile(原作者)
Robert Niederreiter(作者)
Georg Bernhard
Florian Friesdorf
Jens Klein
在 Python 软件基金会许可证 下。
更改
1.9.0 (2022-05-15)
将 movebefore、moveafter、movefirst 和 movelast 函数添加到 odict 中。[rnix]
在 insertfirst 和 insertlast 中使用 first_key 和 last_key 而不是读取所有键。[rnix]
1.8.1 (2022-03-17)
不再为 Python 2.6 和 Python < 3.7 运行测试套件。未对实现进行任何更改。[rnix]
包维护。[rnix]
1.8.0
添加 next_key 和 prev_key 函数。[rnix]
添加 first_key 和 last_key 属性。[rnix]
在 _odict 基类上添加 _list_factory。可以用来修改内部值三元组所使用的列表实现。[rnix]
1.7.0
将 swap、insertbefore、insertafter、insertfirst 和 insertlast 函数添加到 odict 中。[rnix]
1.6.2
在 __repr__ 中使用类名而不是 ‘odict()’。[rnix]
1.6.1
pypi 疯狂。[rnix]
1.6.0
与 Python 3 和 pypy 兼容。[rnix]
1.5.2
修复 1.5.1 版本的权限问题,一些文件只对用户具有读写权限。[jensens,2016-11-25]
1.5.1
实现 __copy__ 和 __deepcopy__ 以与 Python 2.7 兼容。[rnix,2012-10-15]
在 __contains__ 中使用 try/except 而不是 in。[rnix,2012-10-15]
1.5.0
实现 alter_key。[rnix,2012-05-18]
1.4.4
删除未使用的错误变量。[rnix,2011-11-28]
添加有关为什么需要使用 == 和 != 与 _nil 检查的说明。[rnix,2011-11-28]
1.4.3
消除关于 bench.py 中“全局”使用的恼人警告。[jensens,2011-09-20]
1.4.2
进行更多 copy 测试。[rnix,2010-12-18]
将 has_key 添加到 odict。[rnix,2010-12-18]
1.4.1
修复发布问题,README.rst 文件丢失,已添加 MANIFEST.in 文件以包含它。[jensens,2010-11-29]
1.4.0
完整测试覆盖。[chaoflow,rnix,2010-08-17]
代码清理和优化。[chaoflow,rnix,2010-08-17]
1.3.2
通过函数 _dict_impl() 访问提供类的 dict API,并将 odict 逻辑作为抽象基类 _odict 提供。[rnix,2010-07-08]
1.3.1
添加布尔评估测试。[rnix,2010-04-21]
1.3.0
修复对 odict.lt 和 odict.lh 属性的访问。现在可以在不麻烦的情况下覆盖 odict 子类上的 __setattr__ 和 __getattr__。[rnix,2010-04-06]
将 sort 函数添加到 odict。[rnix,2010-03-03]
1.2.6
使 odict 正确进行序列化和反序列化。[gogo,2010-01-12]
1.2.5
添加 as_dict 函数。支持类型转换为普通 dict。[rnix,2009-12-19]
添加基准脚本。[rnix,2009-12-19]
1.2.4
在 __delitem__ 中不要检查 key in self,无论如何都会正确地引发 KeyError。大幅提升速度![rnix,jensens,2009-12-18]
1.2.3
将测试移动到单独的文件,并使用 python setup.py test 使 egg 可测试。[rnix,2009-12-07]
改进 lt 和 lh 属性,使 odict 能够与 copy.deepcopy 一起工作。[rnix,2009-12-07]
1.2.2
在 __setitem__ 中使用 try/except 而不是 __iter__ 来确定值是否已设置。[rnix,2009-07-17]
1.2.1
添加缺失的 __len__ 和 __contains__ 函数。[rnix,2009-03-17]
1.2.0
打包成 egg 格式。[rnix,2009-03-17]
< 1.2
http://code.activestate.com/recipes/498195/ [bearophile,2006-10-12]
许可协议
PYTHON 软件基金会许可协议版本 2
1. 本许可协议是 Python 软件基金会(“PSF”)与访问和使用此软件(“Python”)及其相关文档的个人或组织(“许可方”)之间的协议。
2. 在本许可协议的条款和条件约束下,PSF 现授予许可方非独占的、免费的、全球性的许可,以复制、分析、测试、公开执行和/或展示、准备衍生作品、分发以及以独立形式或任何衍生版本使用 Python,前提是,PSF 的许可协议和 PSF 的版权声明,即“版权所有(c)2001,2002,2003,2004,2005,2006 Python 软件基金会;保留所有权利”应保留在 Python 及其任何衍生版本中。
3. 如果许可方准备了一个基于或包含 Python 或其任何部分的作品,并希望将衍生作品提供给其他人,那么许可方同意在任何此类作品中包含对 Python 所做的更改的简要总结。
4. PSF 以“现状”为基础向许可方提供 Python。PSF 不作任何明示或暗示的保证。例如,但不限于,PSF 不作也不放弃任何关于其适销性或适用于任何特定目的的保证,或者使用 Python 不会侵犯任何第三方权利的保证。
5. 即使被告知存在这种可能性,PSF 也不对许可方或 Python 的任何其他用户因修改、分发或以其他方式使用 Python 或其任何衍生版本而导致的任何偶然性、特殊性或间接性损害或损失负责。
6. 本许可协议在重大违约的情况下自动终止。
7. 本许可协议中的任何内容均不应被视为在PSF和许可方之间建立任何代理、合伙或合资关系。本许可协议不授予使用PSF商标或商号的权利,以商标意义来认可或推广许可方的产品或服务,或任何第三方的产品或服务。
8. 通过复制、安装或以其他方式使用Python,许可方同意受本许可协议的条款和条件的约束。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分布
构建分布
odict-1.9.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | fc4a05c46fd3d574bf9cf89a3e23aa3f1584a246419a1f7365fc36f9f36c2b44 |
|
MD5 | 30f5d3d7676ae8a4be00c83e35c22530 |
|
BLAKE2b-256 | 4ee8cf1364a64065652d13d40d83ad7c31c12d18e8ae824549c8975f3eaf481a |
odict-1.9.0-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 6e7ff07552d3c6cddffac565fdc7fd1fef0220b6c68f518128cab40f82114d97 |
|
MD5 | 6769c758bdacd488920e66d554be3cf3 |
|
BLAKE2b-256 | 7c8702e04067920b8d88800eddae61edcd8f7db8a06d043ec6abe91201752ec3 |