跳转到主要内容

有序字典。

项目描述

Latest PyPI version Number of PyPI downloads Test odict

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 时非常有用。

同时继承自 dictPersistent 会失败。另外,使用常规的 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)

  • movebeforemoveaftermovefirstmovelast 函数添加到 odict 中。[rnix]

  • insertfirstinsertlast 中使用 first_keylast_key 而不是读取所有键。[rnix]

1.8.1 (2022-03-17)

  • 不再为 Python 2.6 和 Python < 3.7 运行测试套件。未对实现进行任何更改。[rnix]

  • 包维护。[rnix]

1.8.0

  • 添加 next_keyprev_key 函数。[rnix]

  • 添加 first_keylast_key 属性。[rnix]

  • _odict 基类上添加 _list_factory。可以用来修改内部值三元组所使用的列表实现。[rnix]

1.7.0

  • swapinsertbeforeinsertafterinsertfirstinsertlast 函数添加到 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.ltodict.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]

  • 改进 ltlh 属性,使 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

许可协议

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 (18.2 kB 查看哈希值)

上传时间

构建分布

odict-1.9.0-py3-none-any.whl (15.2 kB 查看哈希值)

上传时间 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面