Python InfiniteDefaultRevisionDictionary,有实现吗?

问题描述 投票:0回答:1

在编程中,某些基于字典的数据结构非常有用且重要。例如:

  1. 修订词典: 修订字典是字典的子类型,它使键按照上次修改的顺序排序。它通常用于缓存处理,它会记住最近使用的项目。

  2. 默认词典: 当使用字典中不存在的键访问字典时,默认字典可以返回默认元素。它已经在

    collections.defaultdict
    中实现了。

  3. 无限字典: 可以通过无限层嵌套递归来访问无限字典,即无限链接键,例如

    dct[person_name][gender], dct[company_name][employees]
    ,它可以用于创建动态数据结构,甚至可以对文件系统结构进行建模。

所以我的问题是:在Python中,是否可以编写一个具有所有3个功能的字典,即无限的默认修订字典?特别是,可以在创建过程中指定选项,例如项目是否应按插入顺序、键顺序或修订顺序进行排序。如果可以的话如何实施?

如果未来版本的 Python 有一个内置的 Dictionary 类来支持所有这些功能和选项,那就太酷了。

编辑: 第 2 点可能与第 3 点并不矛盾,即原则上,InfiniteDefaultRevisionDictionary 可以具有除 lambda 之外的默认键。例如,如果默认键为 0,则:

dd=InfiniteDefaultRevisionDictionary(default=0, {})
print(dd['a']['b']['c']) # should give 0
dd['b']['c'][2] = [1, '2', 3.5] # should work fine
python dictionary defaultdict revision infinite-recursion
1个回答
0
投票

感谢所有回复的人! 结合不同人的建议以及我自己的研究,以下是我能做的最多的事情。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
InfiniteDefaultRevisionDict sort items in the order of latest updates and allows arbitrary chaining of keys.

For example,

>>> d=InfiniteDefaultRevisionDict()
>>> dct[person_name][gender] = 'M'
>>> dct[company_name][employees] = [...]
"""

import bisect, json
from collections import namedtuple
from collections.abc import MutableMapping


from collections import OrderedDict, defaultdict

class Dict(OrderedDict):
    def __init__(self, default=None, init_dct={}):
        self._default = default
        self.update(init_dct)

    def __setitem__(self, key, value):
        super().__setitem__(key, value)
        self.move_to_end(key)

    def __missing__(self, key):
        self[key] = self._default() if callable(self._default) else self._default
        return self[key]

    def to_json(self, fp=None, **kwargs):
        return json.dumps(self, default=lambda t: dict(t), **kwargs) if fp==None else json.dump(self, fp, default=lambda t: dict(t), **kwargs)

    def from_json(self, fp=None, data=''):
        self.update(json.loads(data, object_hook=lambda t: (Dict(self._default, t) if type(t)==dict else t)) if fp==None \
            else json.load(fp, object_hook=lambda t: (Dict(self._default, t) if type(t)==dict else t)))
        return self


InfiniteDefaultRevisionDict = lambda: Dict(InfiniteDefaultRevisionDict)

无法设置除

InfiniteDefaultRevisionDict
以外的默认lambda。但是,您可以将其序列化为 JSON,并以标准 Python
dict
的形式将其从 JSON 反序列化。希望有人能提出更好的解决方案,满足更多的需求。

© www.soinside.com 2019 - 2024. All rights reserved.