修改多级字典 - 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

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

很感谢任何形式的帮助。

参考方案

我当时正在考虑使用多个索引和一个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))条件意味着元组不能用作键。

Python pytz时区函数返回的时区为9分钟 - python

由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…

R'relaimpo'软件包的Python端口 - python

我需要计算Lindeman-Merenda-Gold(LMG)分数,以进行回归分析。我发现R语言的relaimpo包下有该文件。不幸的是,我对R没有任何经验。我检查了互联网,但找不到。这个程序包有python端口吗?如果不存在,是否可以通过python使用该包? python参考方案 最近,我遇到了pingouin库。

re.findall不返回全场比赛吗? - python

我有一个包含一堆字符串的文件,例如“ size = XXX;”。我第一次尝试使用python的re模块,并且对以下行为感到有些困惑:如果我在正则表达式中使用管道作为“或”,我只会看到返回的匹配项。例如。:>>> myfile = open('testfile.txt','r').read() >…

Spacy如何将标记标签整体化? - python

在包含#标签(例如tweet)的句子中,spacy的令牌生成器将标签分为两个令牌:import spacy nlp = spacy.load('en') doc = nlp(u'This is a #sentence.') [t for t in doc] 输出:[This, is, a, #, sentence, .…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…