在Python中向字典键添加多个值?

时间:2018-12-20 18:17:28

标签: python

我想在python中的字典键上添加多个值。该值再次是一个dict,其中某些参数发生了变化。

我写了下面的代码,但是似乎被覆盖了。有什么有效的方法吗?

from collections import defaultdict
node = 'node 1'
d = defaultdict(dict)
d[node] = {'interface':{'Eth1/48':'10.10.10.1'}} --> Here Eth1/48 is dynamically populated.

d[node] = {'interface':{'Eth1/47':'10.10.11.1'}} --> here Eth1/47 is again dynamically populated.
>>> d
defaultdict(<class 'dict'>, {'node 1': {'interface': {'Eth1/47': '10.10.11.1'}}})

我想要这样的输出:

{'node 1':{'interface': {'Eth1/48':'10.10.10.1'}
                        {'Eth1/47':'10.10.11.1'}

3 个答案:

答案 0 :(得分:1)

使该命令不是命令,而是使键对应于其他命令列表的命令。

d = defaultdict(dict)
d[node] = {'interface': [{'Eth1/48':'10.10.10.1'}]
d[node]['interface'].append({'Eth1/47':'10.10.11.1'})

Dan在下面的评论非常棒。他指出,拥有可以对应同一密钥的IP而不是拥有Eth *:ip对的字典列表更有意义。

d = defaultdict(dict)
d[node] = {'interface': {'Eth1/47':['10.10.10.1']}
d[node]['interface']['Eth1/48'] = ['10.10.10.1']

现在您可以做

d[node]['interface']['Eth1/47'].append('new.ip.address.ballin')
d[node]['interface']['Eth1/48'].append('new.ip.address.ballin')

答案 1 :(得分:1)

这与您的输出不完全匹配,但是我建议您这样做(因为只有一个(键,值)对的命令没有那么有用)。

使用defaultdict(lambda: defaultdict(dict))更深一层。

>>> from collections import defaultdict                                                                                
>>>                                                                                                                    
>>> node = 'node 1'                                                                                                    
>>> d = defaultdict(lambda: defaultdict(dict))                                                                         
>>> d[node]['interface']['Eth1/48'] = '10.10.10.1'                                                                     
>>> d[node]['interface']['Eth1/47'] = '10.10.11.1'
>>>                                                                                                                    
>>> d                                                                                                                  
defaultdict(<function __main__.<lambda>()>,
{'node 1': defaultdict(dict,
    {'interface': {'Eth1/47': '10.10.11.1',
                   'Eth1/48': '10.10.10.1'}})})

答案 2 :(得分:0)

更改内部字典,而不是将新密钥添加到外部字典:

d = defaultdict(dict)
d[node] = {'interface':{'Eth1/48':'10.10.10.1'}}
d[node]['interface']['Eth1/47'] = '10.10.11.1'

如果您有新的值字典,也可以通过以下方式添加:

d[node]['interface'] = {**d[node]['interface'], **{'Eth1/47':'10.10.11.1'}}  # joins current d[node]['interface'] and {'Eth1/47':'10.10.11.1'} into one dict