Python OOP - 如何在嵌套字典中创建引用键的变量?

时间:2017-11-28 03:24:09

标签: python dictionary

我有一本字典:

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)。如何在我的代码中实现它?

1 个答案:

答案 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之外,它不会显着改变代码。