Python如何拼接两个字典生成新对象(Cisco DNA Center场景)
Python 拼接两个重复键字典且保留原字典类型的解决方案
问题根因
你用{**payload_1, **payload_2}合并失败是Python字典的固有特性:字典的键必须唯一,当两个字典有重复键时,后传入的字典的值会覆盖前一个的对应值,你的两个payload所有顶层键完全相同,自然只会保留payload_2的内容。
解决方案
场景1:Cisco DNA Center接口接受数组类型的payload
这是最贴合你期望输出的方案,直接将两个字典存入列表即可,原字典不会被修改,类型也保持不变:
payload = [payload_1, payload_2]
类型校验结果:
>>> type(payload) <class 'list'> >>> type(payload[0]) <class 'dict'> >>> type(payload[1]) <class 'dict'>
输出内容和你期望的完全一致:
>>> print(payload) [ {'groupName': 'POOL_UNDERLAY-LAN-AUTOMATION', 'groupOwner': 'DNAC', 'type': 'generic', 'siteId': 'ffd0d540-6fee-41d1-ba42-430001cf042f', 'ipPools': [{'parentUuid': '0b20b02e-341a-4584-9f79-27ed32682efc', 'dhcpServerIps': ['1.1.1.1', '2.2.2.2'], 'dnsServerIps': ['8.8.8.8'], 'ipPoolOwner': 'DNAC', 'shared': 'true', 'gateways': ['192.168.0.1'], 'ipPoolCidr': '192.168.0/24'}]}, {'groupName': 'POOL_AP', 'groupOwner': 'DNAC', 'type': 'generic', 'siteId': 'ffd0d540-6fee-41d1-ba42-430001cf042f', 'ipPools': [{'parentUuid': '0b20b02e-341a-4584-9f79-27ed32682efc', 'dhcpServerIps': ['1.1.1.1', '2.2.2.2'], 'dnsServerIps': ['8.8.8.8'], 'ipPoolOwner': 'DNAC', 'shared': 'true', 'gateways': ['192.168.1.1'], 'ipPoolCidr': '192.168.1/24'}]} ]
场景2:接口要求payload必须为字典类型
你可以给两个子字典分配独立的外层键,避免键冲突:
payload = { "underlay_lan_pool": payload_1, "ap_pool": payload_2 }
类型校验结果:
>>> type(payload) <class 'dict'> >>> type(payload["underlay_lan_pool"]) <class 'dict'> >>> type(payload["ap_pool"]) <class 'dict'>
两种方案都不会修改原有的payload_1和payload_2,完全符合你的要求。
补充说明
如果你实际需求是将两个IP池合并到同一个地址池组下,不需要拆分两个独立字典,可以直接合并ipPools数组:
payload = payload_1.copy() payload["ipPools"].extend(payload_2["ipPools"])
这样得到的payload是单个字典,包含两个IP池的配置,也符合部分DNAC接口的提交要求。
内容的提问来源于stack exchange,提问作者foxtrom
相关产品推荐
相关产品推荐

