我想创建一个数据结构,用于存储穿过一个平面的各种可能路径,其中多边形散布在该平面上。我决定使用嵌套的多级词典来保存在固定点拆分的各种可能路径。
此类字典的可能实例为:
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
问题:当我有一定长度的键列表时,如何在多级字典中写入变量嵌套/深度级别?
非常感谢您的帮助。
答案 0 :(得分:0)
您当然可以为此类嵌套字典编写访问器:
function onEdit(e) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Programar');
var values = sheet.getRange(2, 16, 3).getValues();
var values_now = sheet.getRange(2, 5, 3).getValues();
var color = '';
var current_row = 2
for (var i = 0; i < values.length; i++)
{
if (values_now[i][0] > values[i][0])
{
SpreadsheetApp.getUi() // Or DocumentApp or FormApp.
.alert(values_now[i][0] + ' ' + values[i][0]);
color='#FFDD88'
}
else if (values_now[i][0] < values[i][0])
{
color = '#CC6666'
}
sheet.getRange(current_row, 5).setBackgroundColor(color);
current_row++
}
}
(对于长列表而言,这两种方法都不有效;更快的版本将使用变量索引,而不是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:]
。)
对于其他方法,这里没有足够的余地继续进行选择。
答案 1 :(得分:0)
我一直在考虑使用多个索引和一个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))
条件意味着元组不能用作键。