我有一本字典:
my_dict = {1: {2: 'A'}, 2: {3: 'B'}, 3: {4: 'C}}
我想以字符串形式创建变量,称为标记,可以引用嵌套键。
例如:'mymarker'
表示我的my_dict[1][2]
,'myothermarker'
表示my_dict[2][3]
。
它们是字符串,所以我可以用我的一种方法分配它们,例如:set_marker(' mymarker',1,2)。如何在我的代码中实现它?
答案 0 :(得分:1)
没有办法直接完成您想要的操作,因为嵌套字典不会只使用一个键来获取内部值。你需要几把钥匙。但是,如果你愿意的话,你可以将一些键存储在一个元组中。然后你可以在循环中使用这些值(如果你并不总是索引到相同的深度)或者通过解包(如果你的话)。
尝试这样的事情:
my_dict = {1: {2: 'A'}, 2: {3: 'B'}, 3: {4: 'C'}}
mymarker = (1, 2)
myothermarker = (2, 3)
a, b = mymarker # you can use unpacking when you know you're indexing to a specific depth
print(my_dict[a][b])
d = my_dict
for key in myothermarker: # or use a loop, for indexing to any depth
d = d[key]
print(d)
您已评论过您希望“标记”值为字符串,并将其与密钥一起传递到set_marker
函数,然后您可以调用set_with_marker
来修改主词典中的键引用的值。这与我上面描述的技术结合起来并不难,你只需要在字符串标记和它们引用的键之间有一个额外的间接层。
这是一个快速,未经测试的实现,可以做你想要的:
markers = {}
def set_marker(name, *keys):
markers[name] = keys # save the keys into the markers dict (as lists)
def get_with_marker(name):
d = my_dict
for key in markers[name]: # this is almost the same as the loop from above
d = d[key]
return d
def set_with_marker(name, value):
*keys, last = markers[name] # unpack last name separately from the others
d = my_dict
for key in keys: # this is similar to before, but we don't index the last level yet
d = d[key]
d[last] = value # we index the last level here, for the assignment
您可能希望这些函数是某个类的方法(my_dict
是实例属性)。除了在一堆地方添加self
之外,它不会显着改变代码。