访问键数组中的字典,或将键初始化为子字典

时间:2017-05-23 13:18:56

标签: python dictionary

我有一个字典(比如说dic),我想在其中添加有关城市的信息,因此数组的示例如下:

lst = ["Belgium", "Flanders", "Antwerp"]

但这可能是:

lst = ["Germany", "Berlin"]

即。我想要更改字典的键数组的长度是未知的。我可以像dic [lst]那样直接进入子目录列表吗?

理想情况下,只要dic [lst]尝试访问尚未定义的密钥,它就会自动生成此密钥。然而,这不是必需的:我总是可以检查子目录是否存在,并在我浏览字典之前首先初始化所有子目录。

我希望有一些函数f,它取一个字典dic,一个键数组lst和一个值val。该函数应返回返回字典dic,但在条目中使用val对应于lst。

1 个答案:

答案 0 :(得分:1)

如果您要查找级联词典,可以使用以下插入机制:

def insert_cascade(dic,lst,val):
    for item in lst[:-1]:
        subdic = dic.get(item)
        if subdic is None:
            subdic = {}
            dic[item] = subdic
        dic = subdic
    dic[lst[-1]] = val

现在,如果我们构建一个world字典:

world = {}

我们插入给定的样本输入,我们将生成:

>>> world = {}
>>> insert_cascade(world,["Belgium", "Flanders", "Antwerp"],'this is Antwerp')
>>> world
{'Belgium': {'Flanders': {'Antwerp': 'this is Antwerp'}}}
>>> insert_cascade(world,["Germany", "Berlin"],42)
>>> world
{'Belgium': {'Flanders': {'Antwerp': 'this is Antwerp'}}, 'Germany': {'Berlin': 42}}

如果我们后来决定添加["Belgium", "Flanders", "Leuven"]["Belgium", "Brussels","Brussels"],我们会得到:

>>> insert_cascade(world,["Belgium", "Flanders", "Leuven"],True)
>>> world
{'Belgium': {'Flanders': {'Leuven': True, 'Antwerp': 'this is Antwerp'}}, 'Germany': {'Berlin': 42}}
>>> insert_cascade(world,["Belgium", "Brussels","Brussels"],object())
>>> world
{'Belgium': {'Brussels': {'Brussels': <object object at 0x7f90f2769080>}, 'Flanders': {'Leuven': True, 'Antwerp': 'this is Antwerp'}}, 'Germany': {'Berlin': 42}}

因此,在这些插入后,我们的world为每个城市组成了一个包含'Belgium''Germany'字典的字典,指定的对象通过val

请注意,您可以在这里任意深入嵌套字典。例如,比利时的结构复杂。因此,对于某些地区/国家/地区,您可能决定比其他地区更深入。