修改多级词典

2024-10-16 17:25:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个数据结构,用于存储通过平面的各种可能路径,平面上散落着多边形。我决定使用嵌套的多级字典来保存在固定点上拆分的各种可能路径。你知道吗

这种词典的一个可能实例是:

path_dictionary = {starting_coordinates:{new_fixpoint1:{new_fixpoint1_1:...}, new_fixpoint2:{new_fixpoint2_1:...}}}

现在我想继续用最后一个固定点的新路径来构建这个结构,所以我必须在不同的嵌套级别上编辑字典。我的计划是提供一个排序键列表,其中包含给定路径的所有固定点,我将有一个函数添加到最后提供的键。你知道吗

为了实现这一点,我必须能够访问具有如下键列表的字典:

keylist = [starting_coordinates, new_fixpoint1, new_fixpoint1_1, new_fixpoint1_1_3, ...]

path_dictionary = {starting_coordinates:{new_fixpoint1:{new_fixpoint1_1:...}, new_fixpoint2:{new_fixpoint2_1:...}}}

path_dictionary [keylist [0]] [keylist [1]] [keylist [2]] [...] = additional_fixpoint

问题:当我有一个一定长度的键列表时,如何在多级字典中写入变量嵌套/深度级别?你知道吗

非常感谢您的帮助。你知道吗


Tags: path路径数据结构列表newdictionary字典级别
2条回答

我一直在玩弄使用多个索引和defaultdict的想法。结果是:

from collections import defaultdict

class LayeredDict(defaultdict):
    def __getitem__(self, key):
        if isinstance(key, (tuple, list)):
            if len(key) == 1:
                return self[key[0]]
            return self[key[0]][key[1:]]
        return super(LayeredDict, self).__getitem__(key)

    def __setitem__(self, key, value):
        if isinstance(key, (tuple, list)):
            if len(key) == 1:
                self[key[0]] = value
            else:
                self[key[0]][key[1:]] = value
        else:
            super(LayeredDict, self).__setitem__(key, value)

    def __init__(self, *args, **kwargs):
        super(LayeredDict, self).__init__(*args, **kwargs)
        self.default_factory = type(self)  # override default

我还没有完全测试它,但是它应该允许您创建任何级别的嵌套字典,并使用元组对它们进行索引。你知道吗

>>> x = LayeredDict()
>>> x['abc'] = 'blah'
>>> x['abc']
'blah'
>>> x[0, 8, 2] = 1.2345
>>> x[0, 8, 1] = 8.9
>>> x[0, 8, 'xyz'] = 10.1
>>> x[0, 8].keys()
[1, 2, 'xyz']
>>> x['abc', 1] = 5
*** TypeError: 'str' object does not support item assignment

不幸的是,不支持扩展符号(或任何它的名称),但是 您只需传入一个列表或元组作为索引。你知道吗

>>> keylist = (0, 8, 2)
>>> x[*keylist]
*** SyntaxError: invalid syntax (<stdin>, line 1)
>>> x[keylist]
1.2345

此外,isinstance(key, (tuple, list))条件意味着元组不能用作键。你知道吗

您当然可以为这样的嵌套字典编写访问器:

def get(d,l):
  return get(d[l[0]],l[1:]) if l else d
def set(d,l,v):
  while len(l)>1:
   d=d[l.pop(0)]
  l,=l   # verify list length of 1
  d[l]=v

(这两种方法对于长列表都不有效;更快的版本将使用变量索引,而不是[1:]pop(0)。)

至于其他方法,这里几乎没有足够的方法来选择一种。你知道吗

相关问题 更多 >