我有一个字典(比如说dic),我想在其中添加有关城市的信息,因此数组的示例如下:
lst = ["Belgium", "Flanders", "Antwerp"]
但这可能是:
lst = ["Germany", "Berlin"]
即。我想要更改字典的键数组的长度是未知的。我可以像dic [lst]那样直接进入子目录列表吗?
理想情况下,只要dic [lst]尝试访问尚未定义的密钥,它就会自动生成此密钥。然而,这不是必需的:我总是可以检查子目录是否存在,并在我浏览字典之前首先初始化所有子目录。
我希望有一些函数f,它取一个字典dic,一个键数组lst和一个值val。该函数应返回返回字典dic,但在条目中使用val对应于lst。
答案 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
。
请注意,您可以在这里任意深入嵌套字典。例如,比利时的结构复杂。因此,对于某些地区/国家/地区,您可能决定比其他地区更深入。