如果我想在子字典中设置一个变量,有没有办法动态地创建缺少的键。你知道吗
本质上,我想创建任何缺少的键并设置我的值。你知道吗
self.portdict[switchname][str(neighbor['name'])]['local']['ports'] = []
目前我正在做,但很混乱:
if not switchname in self.portdict:
self.portdict[switchname] = {}
if not str(neighbor['name']) in self.portdict[switchname]:
self.portdict[switchname][str(neighbor['name'])] = {}
if not 'local' in self.portdict[switchname][str(neighbor['name'])]:
self.portdict[switchname][str(neighbor['name'])]['local'] = {}
if not 'ports' in self.portdict[switchname][str(neighbor['name'])]['local']:
self.portdict[switchname][str(neighbor['name'])]['local']['ports'] = []
有没有办法用一行或两行来代替呢?你知道吗
我过去也遇到过类似的问题。我发现
defaultdict
对我来说是正确的答案,但是写超长的定义(比如@o11c的答案或@Apero的答案)并不好。我想到的是:这将创建一个包含
levels
个嵌套字典的字典。因此,如果levels
=3,则需要3个键来访问底层值。第二个参数是用于创建底层值的函数。像list
或者lambda: 0
或者甚至dict
这样的东西都能很好地工作。你知道吗下面是一个使用4
levels
和list
作为默认函数的“自动”键的示例:我想这基本上就是你想问的问题。您的4个“级别”是交换机名称、邻居名称、本地和端口——看起来您希望在底层有一个
list
来存储端口。你知道吗另一个使用2
levels
和lambda: 0
作为默认值的示例:使用
collections.defaultdict
这在没有递归的情况下更容易做到:
以及一个测试用例:
如果您想拥有它,因此不需要函数,可以使用以下defaultdict工厂,它允许您任意深入地嵌套内容:
相关问题 更多 >
编程相关推荐