gpt4 book ai didi

python - 修改多级词典

转载 作者:太空宇宙 更新时间:2023-11-03 20:59:40 25 4
gpt4 key购买 nike

我想创建一个数据结构,用于存储穿过平面的各种可能路径,其中多边形散布在平面上。我决定使用嵌套的多级字典来保存在固定点分割的各种可能的路径。

此类字典的一个可能实例是:

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 - 修改多级词典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55787207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com