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

3
我希望能够在Python中向字典键添加多个值。该值是一个包含一些参数变化的字典。
我已经编写了以下代码,但似乎会覆盖之前的值。有没有更有效的方法来实现呢?
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个回答

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
由于接口ID是键,地址是值,我认为将每个接口键/值对放在不同的列表元素中意义不大。最好将它们合并到一个字典中,其中接口ID作为键,地址作为值。接口可以容纳多个地址,因此我认为列表应该放在字典值中{'Eth1/48':['10.0.0.1', '10.10.10.1']} - erik258
我认为Ingvar的答案最接近OP想要的,我会选择那个。对于同一键的多个值,我提供了一种解决方法。 - Scrubster
丹,那是一个很棒的想法。我会编辑我的答案来记录你所说的内容。我同意你的评论。这是一个更好的想法。 - Scrubster

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'}})})

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

或者你可以一次性定义内部的dict{'interface':{'Eth1/48':'10.10.10.1', 'Eth1/47': '10.10.11.1'}} - erik258

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接